我正在尝试加入一个表,但我只得到一条记录作为回报。
我有两张桌子:广告和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从结果中删除
答案 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;