我尝试根据CASE的结果进行INNER JOIN。
SELECT *
FROM album
INNER JOIN (
SELECT album_type CASE album.album_type
WHEN 1 THEN "album_int"
WHEN 2 THEN "album_ext"
END FROM album)
AS type ON type.album_id = album.id
WHERE album.id = 6
LIMIT 1;
我在这个网站上看到了一些例子,但在我的案例中没有任何效果。 有人可以帮帮我吗?
答案 0 :(得分:2)
case
不在桌子上工作。您可以使用left join
:
SELECT *
FROM album a LEFT JOIN
album_int ai
ON ai.album_id = a.id AND a.album_type = 1 LEFT JOIN
album_ext ae
ON ae.album_id = a.id AND a.album_type = 2
WHERE a.id = 6 AND a.album_type IN (1, 2)
LIMIT 1;
要将值放入同一列,您需要使用coalesce()
。
注意:如果每个表中最多只有一个匹配项,那么这是正确的。
答案 1 :(得分:2)
您不需要任何case expressions
甚至where clause
。
SELECT a.`id`, COALESCE(aint.`something`, aext.`something`) as something, ...
FROM ALBUM A
LEFT OUTER JOIN ALBUM_INT AS AINT ON A.ID = AINT.ALBUM_ID AND A.ALBUM_TYPE = 1
LEFT OUTER JOIN ALBUM_EXT AS AEXT ON A.ID = AEXT.ALBUM_ID AND A.ALBUM_TYPE = 2
AND A.ALBUM_TYPE = 1 作为join condition
表示ALBUM_INT仅会加入ALBUM行,其中album_type = 1
类似地:
AND A.ALBUM_TYPE = 2 作为join condition
表示ALBUM_EXT仅会加入ALBUM行,其中album_type = 2
请注意,先前由Gordon Linoff给出的答案使用了相同的连接逻辑,我刚刚试图强调它是如何满足所描述的要求的。
答案 2 :(得分:1)
要有条件地加入两个表中的一个,在每个表上创建一个连接列,并将它们组合在一起,如下所示:
SELECT *
FROM albums a
INNER JOIN (
SELECT 1 AS album_type, album_id, colA, colB
FROM album_int
UNION ALL
SELECT 2 AS album_type, album_id, colA, colB
FROM album_ext ) AS b
ON a.album_type = b.album_type
AND a.album_id = b.album_id