【问题标题】:MySQL Select ALL from Left JoinMySQL 从左连接中选择全部
【发布时间】:2012-02-11 23:26:34
【问题描述】:

此查询不起作用。我想要来自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 的两个表中的所有内容。

【问题讨论】:

  • 除了 sintatic 错误之外,您还有语义错误。你只会得到everything from left table where id is 200。你需要一个外连接来获得everything from both tables where the ID is 200
  • 如果 id 可能不存在于swarovski_zones 并且它可能只存在于trafficviews 你应该不接受我的回答并接受@MostyMostacho 的正确答案在那种情况下打开。

标签: mysql select left-join


【解决方案1】:

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

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

【讨论】:

  • 谢谢这个工作,但是在我的表中我看到两个字段“id”它们是两个表的相同自动生成的主键 ID.. 所以行中有它们.. 这会影响它 -我有两个 ID 列?
  • Thw JOINONFROM 子句的一部分。很像ANDOR 可能出现在WHERE 子句中(或HAVING 或...)
  • 正如我所说的@ypercube;我会后悔提供清单:-)。当 OP 遇到问题时,错过 join 似乎毫无意义。
  • @TheBlackBenzKid,您会看到两个 ID,因为您已从两个表中选择了所有内容。如果您不想选择所有内容,那么不幸的是,您将不得不开始命名各个列。如果您想重命名某些列,您仍然必须明确说明列名,但您可以执行 select id as tid from ... 之类的操作
  • 啊,是的 as 命令会很棒。非常感谢。
【解决方案2】:

用户完全外连接

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

【讨论】:

  • MySQL 中没有FULL OUTER JOIN。这不是查询的问题。
  • 那篇文章中没有任何一点是full outer join 写在选择语句中。
  • @ThitLwinOo:不是“使用完全外连接”。您的答案可能是“模拟完全外部连接”(可能还有一个示例)。
【解决方案3】:

这里的问题是右表(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

试一试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    相关资源
    最近更新 更多