INNER JOIN有2个案例

时间:2015-03-13 23:28:55

标签: mysql select case inner-join

我尝试根据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;

我在这个网站上看到了一些例子,但在我的案例中没有任何效果。 有人可以帮帮我吗?

3 个答案:

答案 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)

  • 我有3张桌子(专辑,album_int和album_ext)。
  • 我想将album_int或album_ext加入相册。
  • 如果album.album_type = 1我加入album_int,
  • 如果album.album_type = 2,则加入album_ext。
  • 在album_int和album_int中,我有一个列名为album_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行,其中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