【问题标题】:MySQL join two tables to find all rows EXCEPT the row with the max valueMySQL连接两个表以查找除具有最大值的行之外的所有行
【发布时间】:2012-12-14 16:40:17
【问题描述】:

我正在尝试编写一个查询,该查询将查找组中的所有行,但具有最大值的行除外。到目前为止,我有一个查询可以找到具有最大值的行,但现在我需要找到所有其余的行。这是一个包含两个数据库和示例数据的 SQLFiddle。我也有查找最大行数的查询。 http://sqlfiddle.com/#!2/514d2/33

对于那些不想使用 SQLFiddle... 表名:列表 表名:出价

SELECT listings.end_date, listings.user_id, listings.title, 
  listings.auc_fp, listings.id, listings.auc_image1
FROM listings 
JOIN bids b1 
ON b1.listing_id=listings.id 
LEFT JOIN bids b2 
ON b2.listing_id=listings.id AND b1.bid < b2.bid
WHERE b1.user_id = 1
AND b2.bid IS NULL
AND listings.end_date > NOW()
ORDER BY listings.list_ts DESC

上面是查找最大行数的查询。我正在尝试将listings 表与listings.id=bids.listing_id 上的bids 表连接起来。然后我需要找到用户($user 或用户“1”)对该列表出价的所有行。然后我需要排除用户所在的列表具有最高出价(这就是上面的查询所做的)。

我最初认为我可以使用上面的查询作为子查询来排除用户是最高出价者的列表。但我不确定这是否是最好的方法,而且我不擅长子查询。

【问题讨论】:

  • 哪个是值列?
  • bids.bid 是值列

标签: mysql sql join max


【解决方案1】:

请注意,答案已根据下面的 cmets 进行了多次修改。

SELECT
    lst.end_date,
    lst.title,
    lst.auc_fp,
    lst.id as listing_id,
    lst.auc_image1,
    b.user_id as bid_user_id,
    b.bid as bid_amount,
    maxbids.maxbid as maxbid_for_listing
FROM listings lst
INNER JOIN
(
    SELECT listing_id, MAX(bid) maxbid
    FROM bids b
    GROUP BY listing_id
) maxbids ON lst.id = maxbids.listing_id
INNER JOIN bids maxusers ON maxusers.bid = maxbids.maxbid AND maxusers.listing_id = maxbids.listing_id
INNER JOIN bids b ON
    maxbids.listing_id = b.listing_Id AND
    b.bid < maxbids.maxbid AND
    b.user_id <> maxusers.user_id
WHERE lst.end_date > NOW()
ORDER BY lst.list_ts DESC

【讨论】:

  • 哦,这是使用你小提琴中的模式的小提琴:sqlfiddle.com/#!2/514d2/51
  • 这是查找用户出价最高的列表。实际上,我没有看到指定用户“1”的位置,因此它可能正在查找所有当前出价较高的列表。我要做的是排除用户“1”出价高的列表,但返回用户“1”出价的列表。
  • 如果用户对某个列表有 2 个出价,其中一个是最高出价,您是否仍希望返回较低的出价。或者,对于该列表,您是否不希望返回任何内容,因为用户也有最高出价?
  • 实际上,由于用户是最高出价的列表已经在其他地方显示,我想排除用户是当前最高出价者的所有列表。
  • 好的,我已经修改过了。请参阅上面的新答案,以及此处的新小提琴:sqlfiddle.com/#!2/8818e/8。请注意,我必须在模式的第 87 行插入额外的一行才能返回任何内容。架构示例的编写方式,只有 6469 和 6472 有出价。用户 1 是这两个的最大用户,因此不会返回任何内容。通过在 6469 上添加用户 2 的出价,这不是最高出价,我可以证明正在为列表选择非最高出价用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多