在分组之前使用orderby来自两个不同的表

时间:2016-03-27 14:33:19

标签: mysql stored-procedures group-by sql-order-by

我有以下查询

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()

3 个答案:

答案 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