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 之前给出的答案使用相同的连接逻辑,我只是​​试图强调它如何满足描述的要求。