【问题标题】:SQL two table LEFT JOINs with multiple WHERE conditions from both tablesSQL 两个表的 LEFT JOIN 与来自两个表的多个 WHERE 条件
【发布时间】:2017-02-20 16:48:38
【问题描述】:

我不知道我的查询可能有什么问题,但过去几个小时我一直在努力摸索。也许有人可以通过指出我的问题来提供帮助。

我正在尝试从表一中获取匹配的成员,并使用下面的查询从两个表中使用多个条件加入表二,但它继续返回空字段或说行,即使我非常确定有匹配项:

SELECT s.name, s.gender, s.level, s.program, s.registered
     , s.available, s.dispic, c.staff, c.level, c.year, c.period
FROM students s
LEFT JOIN allots c ON s.level=c.level AND s.registered=1 AND s.available=0
WHERE c.staff=:staff
  AND c.year=:year
  AND c.period=:period
  AND c.level=:level
  AND c.subject:subject
ORDER BY s.name DESC;

所有的努力都被证明是错误的。

【问题讨论】:

  • 如果您提供示例数据以及结果输出,这将有所帮助,在给定示例数据的情况下,您希望您的 SQL 返回。
  • 除了@MJH 的评论,你能提供一个 SQL Fiddle 吗?

标签: mysql rows multiple-conditions


【解决方案1】:

如果您使用 where 子句限制左连接的右侧,您实际上将其更改为内连接(因为您消除了右侧返回的空行)(有关更多信息,请参阅this question)。不要在 where 子句中应用条件,而是将它们移到连接谓词中。

这应该是你想要的:

SELECT s.name, s.gender, s.level, s.program, s.registered
     , s.available, s.dispic, c.staff, c.level, c.year, c.period
FROM students s
LEFT JOIN allots c ON s.level=c.level 
  AND c.staff=:staff
  AND c.year=:year
  AND c.period=:period
  AND c.level=:level
  AND c.subject=:subject
WHERE s.registered=1 AND s.available=0
ORDER BY s.name DESC;

【讨论】:

  • 非常感谢大家的支持,因为我不仅得救了,而且还学到了一点,在Joins中,从解决方法来看,第二张表的条件必须在ON 子句,如果我是对的,第一个表的那些子句转到 WHERE 子句。不过,我必须得到纠正!但是,我在学校,所以我会实施它并报告,因为我记得尝试了几种解决方案,比如@invissible 建议的,但没有成功。我强烈希望这就像一个魅力,因为我没有尝试这个解决方案。再次感谢。
  • 对不起,但这也不起作用。我的意思是它根本没有做任何事情,甚至没有抛出错误。那么可能是什么原因呢?
  • @DerickMarfo 在没有看到一些示例数据的情况下,我真的无法说出可能出了什么问题。对于您描述的问题,查询应该没问题。也许您可以编辑您的问题并添加一些示例数据和预期结果。
  • 我必须首先为之前的评论向你道歉。很抱歉,错误来自我脚本中的一个数组,该数组有一个未定义的键。再次非常抱歉!!!正如我预期的那样,您的解决方案就像一个魅力。这是一个完美的解决方案,一个可靠的解决方案,也是一个有用的指南。非常感谢!!!
  • 对不起,我在上面的评论中添加了@jpw,但不幸的是,无论出于何种原因,它都被省略了。非常感谢。
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2014-07-19
  • 2022-06-10
  • 2018-03-29
  • 1970-01-01
  • 2019-06-13
相关资源
最近更新 更多