加入仅显示一条记录

时间:2016-12-27 15:35:50

标签: mysql sql join

我正在尝试加入一个表,但我只得到一条记录作为回报。

我有两张桌子:广告和ads_bid。广告始终有ads_id。如果有人对广告出价,ads_bid只会填充ads_id

我想要的是广告中的所有广告信息以及表ads_id

中的最高出价

我尝试了以下内容:

SELECT 
    a.*
FROM 
    ads as a
INNER JOIN (
    SELECT ab1.ads_id, ab1.bid
    FROM ads_bid as ab1
) as ab
ON
    a.ads_id = ab.ads_id
WHERE 
    a.belong_to_categories = :categories_id
AND
    (a.ads_status = :ads_status1 OR a.ads_status = :ads_status2)
ORDER BY 
    a.ads_id DESC
LIMIT :limit, :perpage

您可以假设限制和perpage以及ads_status都是正确的。

这给了我一个出价最高的广告。每个类别大约有10个广告,因此我预计将获得10个广告,其中包含9个空出价和1个出价广告。

我做错了什么?

广告表

广告出价表

所以我希望第二张图片中的蓝色列加入第一张照片。 ads_id 0000000003不在ads_bid表格中,所以我希望出价值为空,而不是将0000000003从结果中删除

3 个答案:

答案 0 :(得分:0)

  

预计10个广告包含9个空出价,1个广告带有出价

我是否理解ads_bid只有1条记录?如果是这种情况,那么您要找的是LEFT OUTER JOIN,而不是INNER JOIN。只有当两个表都匹配任何给定记录时,INNER JOIN才会生成结果,而OUTER JOIN将产生结果超集,并且当没有匹配记录时,将额外字段保留为NULL找到了联接表。

(具体来说,LEFT OUTER JOIN将显示连接中“第一个”表的记录的超集,以及当要连接的表中没有匹配记录时的NULL值。其他类型的{{ 1}} s可用于显示“完整”超集,或者正在连接的表的超集等。)

答案 1 :(得分:0)

这应该有效:

select a.*, b.max_bid 
from ads a 
left join (
  select b1.ads_id, IFNULL(max(b1.bid),0) as max_bid from ads_bid b1 group by b1.ads_id
) b on a.ads_id=b.ads_id

P.S。我没有测试过它:)

答案 2 :(得分:0)

我仍然不确定你的预期结果是什么。你的帖子不清楚。

但这是我的尝试:

http://sqlfiddle.com/#!9/d031bd/10

SELECT 
    a.*, ab.bid
FROM 
    ads as a
LEFT JOIN (
  SELECT ads_id, MAX(bid) bid
  FROM ads_bid
  GROUP BY ads_id
) as ab
ON 
    a.ads_id = ab.ads_id
WHERE 
    a.belong_to_categories = '0000000014_0000000016_0000000025'
AND
    (a.ads_status = 1 OR a.ads_status = 3)
ORDER BY 
    a.ads_id DESC;