【发布时间】:2015-02-18 17:08:20
【问题描述】:
今天我尝试了一些更复杂的 MySQL 查询,我注意到 MySQL 的 LEFT JOIN 不适用于 WHERE 子句。我的意思是,它确实返回了一些记录,但它不返回右侧为空的记录。
例如,假设我们有表格:
专辑;专辑说唱 id艺术家标题曲目; id艺人头衔排名 ---- -------- ---------- --------------- ; ---- --------- ----- -------------- 1 张约翰·多伊混合 CD 20 ; 3 标记 CD #7 15 2 标记 CD #7 35 ;
当我运行这个查询时:
SELECT
t1.artist as artist,
t1.title as title,
t1.tracks as tracks,
t2.rank as rank,
FROM
albums as t1
LEFT JOIN
albums_rap as t2
ON
t1.artist LIKE t2.artist
AND
t1.title LIKE t2.title
WHERE
t2.rank != 17
我明白了:
艺人主打歌排名 ------ ----- ------ ----- 标记 CD #7 35 15
但是当我在这个查询中用“AND”替换“WHERE”时,我得到:
艺人主打歌排名 ------ --------- ------ ----- 标记 CD #7 35 15 John Doe Mix CD 20 NULL
为什么第一个不返回带有“NULL”的记录(null 不等于 17...)
我希望你明白我的意思,你会以某种方式解释我的不同之处。抱歉我的英语不好,这不是我的母语。
【问题讨论】:
-
左连接条件为内连接。
-
您确实需要重新考虑您的餐桌设计。对于初学者来说,将艺术家作为字符串存储在专辑表中是一个非常糟糕的主意。如果他们都被称为“约翰史密斯”,你如何区分他们?您应该有一个单独的艺术家表并将艺术家 ID 存储在专辑表中。此外,为每种类型设置单独的表格也很糟糕。改为使用流派 ID 列
-
@GordonM:这只是一个例子,我的桌子看起来一点也不像,但我想不出更好更简单的。无论如何,在专辑表中包含所有艺术家和 ID 的表是个好主意,谢谢!
标签: php mysql sql left-join where