【问题标题】:Ordering JOIN results when grouping分组时排序 JOIN 结果
【发布时间】:2013-02-07 15:07:23
【问题描述】:

以下面为例:

SELECT 
    *
FROM 
    auctions AS a 
    LEFT JOIN winners AS w ON a.auction_id=w.auction_id
WHERE 
    a.active=1 
AND 
    a.approved=1 
GROUP BY
    a.auction_id
ORDER BY
    a.start_time DESC
LIMIT
    0, 10;

有时这可能会匹配winners 表中的多个结果;我不需要它们,但是如果有多个匹配项,我想控制我得到的行。我怎样才能在获胜者表上写一个ORDER BY 以确保我想要的行是第一行?

【问题讨论】:

  • 请不要这样做。当您在单个列上选择 *GROUP BY 时,您的订单将永远不会得到保证。
  • 你能发布你的表结构吗?
  • GROUP BY a.auction_id 在您的查询中应该做什么?您没有进行聚合,而且您还选择了比GROUP BY 子句更多的列。 (我一直不明白为什么 mySQL 允许这样做)
  • 您能否发布一些示例数据来解释如何订购?另外,您是在寻找订单,还是想获得唯一具有最新 start_time 的行?
  • @njk 我知道有人会对此发表评论哈哈....这只是为了举例,因为我的列太多了,我真的不需要在这里显示它们. :)

标签: mysql sql join sql-order-by left-join


【解决方案1】:

如果不查看您的表结构很难准确回答,但是如果您的winners 表有获胜者日期列或类似的内容,那么您可以使用聚合函数来获取第一条记录。

然后您可以返回与此类似的最早日期的记录:

SELECT *
FROM auctions AS a 
LEFT JOIN winners w1
  ON a.auction_id=w1.auction_id
LEFT JOIN
(
  select auction_id, min(winner_date) MinDate -- replace this with the date column in winners
  from winners 
  group by auction_id
) AS w2
  ON a.auction_id=w2.auction_id
  and w1.winner_date = w2.MinDate
WHERE a.active=1 
  AND a.approved=1 
ORDER BY a.start_time DESC

【讨论】:

    【解决方案2】:
    SELECT *
    FROM   auctions AS a
           LEFT JOIN (select auction_id from winners order BY auction_id limit 1) AS w ON a.auction_id = w.auction_id
    WHERE  a.active = 1
           AND a.approved = 1
    GROUP  BY a.auction_id
    ORDER  BY a.start_time DESC
    

    将连接子句中对获胜者表的引用更改为子查询。然后,您可以控制返回的记录数量和顺序。

    【讨论】:

    • @Brett 如果您想要每次拍卖的第一个日期,那么这个答案将不会返回。这在子查询中只返回一条记录,它不会为每次拍卖返回一条记录。
    • SELECT TOP? TOP 是什么?这个问题被标记为“MySQL”,而不是“SQL-Server”..
    猜你喜欢
    • 2011-11-30
    • 2015-04-26
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多