INNER JOIN 与 2 CASE
INNER JOIN with 2 CASE
我尝试根据 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;
我在这个网站上看到了一些例子,但对我来说没有用。
有人可以帮助我吗?
case
不适用于 table。您可以使用 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()
。
注意:如果每个 table 中最多有一个匹配项,则这样做是正确的。
要有条件地连接到两个 table 之一,请在每个 table 上创建一个连接列并将它们联合在一起:
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
- 我有 3 个表(专辑,album_int 和 album_ext)。
- 我想加入 album_int 或 album_ext 相册。
- if album.album_type = 1 我加入album_int,
- else if album.album_type = 2 我加入 album_ext.
- 在 album_int 和 album_int 中,我有一个列名称 album_id(相同的唯一
相册中的 ID)
您不需要 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_type = 1
类似地:
AND A.ALBUM_TYPE = 2 作为 join condition
意味着 ALBUM_EXT 将仅加入 album_type = 2
请注意,Gordon Linoff 之前给出的答案使用相同的连接逻辑,我只是试图强调它如何满足描述的要求。
我尝试根据 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;
我在这个网站上看到了一些例子,但对我来说没有用。 有人可以帮助我吗?
case
不适用于 table。您可以使用 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()
。
注意:如果每个 table 中最多有一个匹配项,则这样做是正确的。
要有条件地连接到两个 table 之一,请在每个 table 上创建一个连接列并将它们联合在一起:
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
- 我有 3 个表(专辑,album_int 和 album_ext)。
- 我想加入 album_int 或 album_ext 相册。
- if album.album_type = 1 我加入album_int,
- else if album.album_type = 2 我加入 album_ext.
- 在 album_int 和 album_int 中,我有一个列名称 album_id(相同的唯一 相册中的 ID)
您不需要 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_type = 1
类似地:
AND A.ALBUM_TYPE = 2 作为 join condition
意味着 ALBUM_EXT 将仅加入 album_type = 2
请注意,Gordon Linoff 之前给出的答案使用相同的连接逻辑,我只是试图强调它如何满足描述的要求。