有一个表messages
包含如下所示的数据:
Id Name Other_Columns
-------------------------
1 A A_data_1
2 A A_data_2
3 A A_data_3
4 B B_data_1
5 B B_data_2
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
如果我运行查询select * from messages group by name
,我会得到如下结果:
1 A A_data_1
4 B B_data_1
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
什么查询将返回以下结果?
3 A A_data_3
5 B B_data_2
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
也就是说,应返回每组中的最后一条记录.
目前,这是我使用的查询:
SELECT
*
FROM (SELECT
*
FROM messages
ORDER BY id DESC) AS x
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
但这看起来非常低效.还有其他方法可以达到相同的效果吗?
好的经过几个小时的研究并仍在使用DB :: select我不得不问这个问题.因为我即将把我的电脑拉下来;).
我想得到用户的最后一个输入(基于时间戳).我可以使用原始sql执行此操作
SELECT c.*, p.*
FROM users c INNER JOIN
(
SELECT user_id,
MAX(created_at) MaxDate
FROM `catch-text`
GROUP BY user_id
) MaxDates ON c.id = MaxDates.user_id INNER JOIN
`catch-text` p ON MaxDates.user_id = p.user_id
AND MaxDates.MaxDate = p.created_at
Run Code Online (Sandbox Code Playgroud)
我从另一个帖子此查询这里的计算器.
我已尝试使用Laravel中的流畅查询构建器完成所有操作,但没有成功.
我知道手册说你可以这样做:
DB::table('users')
->join('contacts', function($join)
{
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
Run Code Online (Sandbox Code Playgroud)
但这没有多大帮助,因为我不知道如何在那里使用子查询?谁可以点亮我的一天?
我需要做一个大问题,但我只想要最新的记录.
对于单个条目,我可能会做类似的事情
SELECT * FROM table WHERE id = ? ORDER BY date DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但是我需要为大(数千个条目)数量的记录提取最新记录,但只记录最新条目.
这就是我所拥有的.效率不高.我想知道是否有更好的方法.
SELECT * FROM table a WHERE ID IN $LIST AND date = (SELECT max(date) FROM table b WHERE b.id = a.id);
Run Code Online (Sandbox Code Playgroud) 此查询用于以一对多关系检索最后的记录(请参阅SQL连接:选择一对多关系中 的最后记录)
SELECT p.*
FROM customer c
INNER JOIN (
SELECT customer_id, MAX(date) MaxDate
FROM purchase
GROUP BY customer_id
) MaxDates ON c.id = MaxDates.customer_id
INNER JOIN purchase p ON MaxDates.customer_id = p.customer_id
AND MaxDates.MaxDate = p.date;
Run Code Online (Sandbox Code Playgroud)
我的问题:如何使用jpa criteria-api的subselect构建此连接?可能吗?如果没有,可以使用jpql吗?
我的代码到目前为止:
final CriteriaBuilder cb = entityManager.getCriteriaBuilder();
final CriteriaQuery<Purchase> query = cb.createQuery(Purchase.class);
final Root<CustomerEntity> root = query.from(Customer.class);
// here should come the join with the sub-select
final Path<Purchase> path = root.join(Customer_.purchases);
query.select(path);
final TypedQuery<Purchase> typedQuery = entityManager.createQuery(query);
return typedQuery.getResultList();
Run Code Online (Sandbox Code Playgroud) (这是SQL连接中线程的django版本:选择一对多关系中的最后一条记录)
假设我有一张顾客表和一张购买表.每次购买都属于一个客户.我想获得所有客户的清单以及他们的上次购买.可以在没有原始SQL且没有多个数据库查询的情况下完成吗?
我有两个模型:公司和交易(具有多关系)。交易模型具有balance
属性。我有一个加入模型的查询:
scope :joined_transactions, (lambda do
select('transactions.balance as current_balance')
.joins('LEFT OUTER JOIN transactions ON transactions.company_id = companies.id')
end)
Run Code Online (Sandbox Code Playgroud)
但是,我只想将最后一笔交易包含到该查询中。结果Company.joined_transactions.first.current_balance == Company.first.transactions.last.balance
应该是真的。
sql ×3
activerecord ×1
criteria-api ×1
distinct ×1
django ×1
group-by ×1
join ×1
jpa-2.0 ×1
laravel ×1
laravel-4 ×1
mysql ×1
postgresql ×1
subquery ×1