【问题标题】:How can I SELECT all jobs from jobs table and the MAXIMUM job bid from bids table?如何从作业表中选择所有作业并从投标表中选择最大作业投标?
【发布时间】:2014-11-11 11:22:03
【问题描述】:

我有两张桌子

工作:

jobID, col1, col2

和出价:

bidID、jobID、bid、状态

任何工作都可以有无限数量的投标。

我想在表格客户端中显示结果,其中显示所有作业详细信息,以及每个作业的最高出价和该出价的状态。

我似乎能够显示最高出价,但不能显示该出价的相应状态。

感谢您的帮助!

SELECT jobs.jobID as jobID, jobs.col1 as col1, jobs.col2 as col2, 
MAX(bids.bid) as bid, bids.status as status
FROM jobs
JOIN bids on jobs.jobID = bids.jobID
GROUP BY jobID
ORDER BY bid desc;

【问题讨论】:

  • 您正在混合作业投标和投标。还是那两个不同的表?
  • 也许可以尝试使用更独特的名称,乍一看这是一个令人困惑的查询
  • 谢谢 Shomz。只有两个表(作业和投标)。我确实在混合投标和工作投标。

标签: mysql join


【解决方案1】:

您可以使用substring_index()/group_concat() 技巧做到这一点:

SELECT j.*, MAX(b.bid) as bid,
       substring_index(group_concat(jb.status order by b.bid desc), ',', 1) as status
FROM jobs j left join
     jobbids jb
     on j.jobID = jb.jobID left join
     bids b
     on jb.bidId = b.bidId
GROUP BY j.jobId
ORDER BY bid desc;

我做了以下更改:

  • 您想要jobs 中的所有行,所以我将joins 更改为left join
  • 你引用了一个bids 表,所以我把它加进去了。
  • 我添加了获取最后状态的逻辑

注意:这是假设出价的数量不是太大。 MySQL 对group_concat() 生成的字符串有一个(可配置的)最大大小。

【讨论】:

  • 谢谢 Gordon,我在原帖中打错了字(现已更正)。只有两张桌子。工作和出价。
  • 我认为这个解决方案的扩展性非常糟糕吗?
【解决方案2】:

尝试以下查询:-

SELECT jobs.jobID as jobID, jobs.col1 as col1, jobs.col2 as col2, 
MAX(bids.bid) as bid, bids.status as status
FROM jobs
JOIN bids on jobs.jobID = bids.jobID
GROUP BY jobID, status
ORDER BY bid desc;

现在尝试编辑版本。 希望对您有所帮助。

【讨论】:

  • 非常感谢您。这实际上是我正在使用的查询。我原来的帖子有错误。现在会改变。上述查询的问题在于,它不会从 bids 表中选择与最高出价在同一记录中的作业状态。
【解决方案3】:

库存答案是一个未关联的子查询,如手册中所述 (http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html)

SELECT j.*
     , x.* 
  FROM bids x 
  JOIN 
     ( SELECT jobID,MAX(bid) max_bid FROM bid GROUP BY jobID ) y 
    ON y.jobID = x.jobID
   AND y.max_bid = x.bid
  JOIN jobs j
    ON j.jobID = x.jobID;

【讨论】:

  • 虽然您的解决方案可能会或可能不会解决问题,但请添加一些关于您的代码在做什么的解释
猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2013-11-09
  • 1970-01-01
相关资源
最近更新 更多