我有以下查询
SELECT
quote.id ,
quote.createdAt,
status.status AS 'Status'
FROM
quote
JOIN
quotelog ON quotelog.quote = quote.id
JOIN
status ON status.id = quotelog.status
引用和quotelog之间的关系是一对多,我想要的是显示引用的最新引号。
引号和quotelog都有created_at,我在这里显示引用的创建日期。
结果虽然每个报价都有多个状态,但我只想获得每个报价的最新报价
id createdAt Status
1 07-12-15 6:14 newQuote
2 07-12-15 6:40 newQuote
2 07-12-15 6:40 quoteCancelled
3 07-12-15 7:21 newQuote
3 07-12-15 7:21 quotePaused
4 07-12-15 8:17 newQuote
4 07-12-15 8:17 quoteCompleted
添加group by quote.id我得到了这个
id createdAt Status
1 07-12-15 6:14 newQuote
2 07-12-15 6:40 newQuote
3 07-12-15 7:21 newQuote
4 07-12-15 8:17 newQuote
我希望它看起来像这样
id createdAt Status
1 07-12-15 6:14 newQuote
2 07-12-15 6:40 quoteCancelled
3 07-12-15 7:21 quotePaused
4 07-12-15 8:17 quoteCompleted
所以我需要的是通过qoutelog.createdAt订购才能通过quote.id进行分组。
我在stackoverflow中找到了答案,但是它们只通过在分组后使用HAVING或者包含顺序的自连接子查询结果来处理一个表 或者使用Mysql不支持的Row_number()
答案 0 :(得分:0)
看起来可以使用pop
函数来处理:
MAX()
因为' q'比那更大' n' ,它会选择引用.. *首先。
如果对于每个id,可以有多个(超过2个)状态,包括一些带引号...... *然后你必须指定你想要选择它们的逻辑,我将调整查询。 / p>
答案 1 :(得分:0)
您不要将group by
用于此操作。您想要选择整个行,而不是汇总一行中的列。
该方法使用一些逻辑来选择行。我猜created_at
确实来自quote_log
,而不是quote
。
这是一种方法:
SELECT q.id, q.createdAt, s.status
FROM quote q JOIN
quotelog ql
ON ql.quote = q.id JOIN
status s
ON s.id = ql.status
WHERE ql.created_at = (SELECT MAX(ql2.created_at)
FROM quotelog ql2
WHERE ql2.id = ql.id
);
答案 2 :(得分:0)
通过quotelog获取max(createdAt)的最佳解决方案是使用子查询返回最大日期,然后将这些表与最大日期连接
SELECT quote.id
, quote.createdAt
, status.status
FROM quote
INNER
JOIN ( SELECT quote
, MAX(createdAt) AS latest
FROM quotelog
GROUP
BY quote ) AS q
ON q.quote = quote.id
INNER
JOIN quotelog
ON quotelog.quote = q.quote
AND quotelog.createdAt = q.latest
INNER
JOIN status
ON status.id = quotelog.status