MySQL从左连接中选择ALL

时间:2012-02-11 23:26:35

标签: mysql select left-join

此查询不起作用。我希望LEFT JOIN的所有结果都是某些东西。这是我的确切代码:

SELECT * FROM `swarovski_zones` WHERE `siteid`='200'
LEFT JOIN `trafficviews` ON `swarovski`.`id`=`trafficviews`.`adid`

swarovski_zones表格为 siteid 200

trafficviews表格为 adid 200

200是表之间的链接变量。我想要ID为200的两个表格中的所有内容。

3 个答案:

答案 0 :(得分:7)

查询不起作用,因为语法不正确。它应该是:

select
from
join
on
where
group by
having
order by
limit

给你:

select *
  from `swarovski_zones`
  left join `trafficviews`
    on `swarovski`.`id` = `trafficviews`.`adid`
 where `siteid` = '200'

同样,siteid是一个字符串而不是一个整数?

我可能会后悔提供上面的清单......

Limit!我忘了Limit;完整语法列表为here

答案 1 :(得分:1)

用户完全外部加入

SELECT * FROM `swarovski_zones` WHERE `siteid`='200'
FULL OUTER JOIN `trafficviews` ON `swarovski`.`id`=`trafficviews`.`adid`

答案 2 :(得分:1)

这里的问题是右表中的元素(trafficviews)可能在左表(swarovski_zones)中没有对应的行。因此,左连接将从左侧获取所有元素,并可能从右侧省略一些元素。

要解决此问题,您需要一个外部联接。你的问题是MySQL不支持外连接:)这可以通过以下一般方式解决:

SELECT * FROM a LEFT JOIN b ON a.id = b.id
UNION ALL
SELECT * FROM a RIGHT JOIN b ON a.id = b.id WHERE a.id IS NULL;

应用于您的问题,应该是这样的:

SELECT * FROM swarovski_zones s
LEFT JOIN trafficviews ON s.id = t.adid
UNION ALL
SELECT * FROM swarovski_zones s
RIGHT JOIN trafficviews ON s.id = t.adid WHERE s.id IS NULL
WHERE s.siteid = 200 or t.adid = 200

试一试。