0

我需要一点帮助。不知道为什么我无法理解这一点。

我有一张用于歌曲、流派和两者之间关联的表格。

SONGS
song_id
song_name
active (0,1)

GENRE
genre_id
genre_name (rock,jazz,classical,newage,opera)

ASSOC
song_id
genre_id

我可以像这样进行简单的搜索...

SELECT s.song_name, s.song_id
FROM (songs s)
LEFT JOIN assoc a ON s.song_id = a.song_id
WHERE s.active = 1
AND a.genre_id = 1

和这样的多重搜索。

SELECT s.song_name, s.song_id
FROM (songs s)
LEFT JOIN assoc a ON s.song_id = a.song_id
WHERE s.active = 1
AND (a.genre_id = 1 
   OR a.genre_id = 2)

但是,如果我想得到 1 和 2 OR 3 怎么办?这不起作用。

SELECT s.song_name, s.song_id
FROM (songs s)
LEFT JOIN assoc a ON s.song_id = a.song_id
WHERE s.active = 1
AND a.genre_id = 1
AND (a.genre_id = 2 
   OR a.genre_id = 3)

提前感谢您的帮助。我有一种感觉,我只是以错误的方式看待这个问题。

4

3 回答 3

1

试试这个,

   SELECT s.song_name, s.song_id
    FROM (songs s)
    LEFT JOIN assoc a ON s.song_id = a.song_id
    WHERE s.active = 1
    AND (a.genre_id = 1
    OR a.genre_id = 2 
       OR a.genre_id = 3)

你的 where 子句是错误的,因为

AND a.genre_id = 1 AND (a.genre_id = 2 OR a.genre_id = 3)

这意味着在一排你有两个选择

a.genre_id=1 and a.genre_id=1 or
a.genre_id=1 and a.genre_id=3

而且每行只有一个genre_id,所以在同一行中不能没有2个值

于 2012-06-07T19:30:48.857 回答
0
SELECT s.song_name, s.song_id
FROM (songs s)
LEFT JOIN assoc a ON s.song_id = a.song_id
WHERE s.active = 1
AND (a.genre_id = 1
  AND a.genre_id = 2) 
OR a.genre_id = 3

我想这就是你要找的

于 2012-06-07T19:34:27.947 回答
0

您可以执行自联接:

SELECT s.song_name, s.song_id
FROM   songs AS s
  JOIN assoc AS a1 ON a1.song_id = s.song_id AND a1.genre_id = 1
  JOIN assoc AS a2 ON a2.song_id = s.song_id AND a2.genre_id IN (2,3)
WHERE  s.active = 1
于 2012-06-07T19:36:01.193 回答