SELECT,JOIN和WHERE!=语句返回太多行

时间:2013-09-23 17:16:48

标签: mysql

试图让一个棘手的mysql select语句工作 - 我需要一些帮助来冷却我的燃烧的noggin ...我感觉你们其中一个MYSQL英雄将会看到这个并将其关闭。

目标:列出给定用户不属于给定类别的歌曲。

三张桌子: 表1:歌曲,分配了UserID的许多字段和唯一的SongID

表2:类别,3 +字段,分配了UserID和唯一的CatID

表3:链接器,一对多用于列出一个或多个类别中的歌曲。 3个字段,唯一ID(索引),SongID,CatID

以下内容让我接近 - 但是没有列出完全没有分配给任何其他类别的用户歌曲,或者已经分配给另一个类别的歌曲(我想谢谢!=)。

SELECT DISTINCT song.SongName, song.UserID, song.SongID  FROM song  
JOIN linker ON song.SongID = linker.SongID 
WHERE  linker.CatID != 155 AND song.UserID =2

然后,我尝试了这个,

SELECT DISTINCT song.SongName, song.UserID, song.SongID FROM song 
LEFT JOIN linker ON song.SongID = linker.SongID 
WHERE (linker.SongID IS NULL OR linker.CatID != 155) AND song.UserID =2 

更近但不起作用(仍然感谢!=包括已分配的歌曲)。

我想我可以在不调用表2的情况下逃脱,因为它只是为给定用户添加和定义类别。或者,我正在考虑获取所有用户的歌曲,然后使用给定的CatID取消设置数组值 - 但这似乎不应该是必要的?我觉得我错过了一些简单的东西?如果绝对需要改变,表结构在这一点上并不神圣。感谢任何分享他们想法的人。

2 个答案:

答案 0 :(得分:2)

试试这个(我已经习惯了MSSQL,所以如果我的语法关闭,请提前道歉):

SELECT s.SongName, s.UserID, s.SongID
FROM song s
LEFT JOIN linker l on s.SongID = l.SongID AND l.CatID = 155
WHERE s.UserID = 2
AND l.ID is null

答案 1 :(得分:0)

SELECT DISTINCT song.SongName, song.UserID, song.SongID 
  FROM song 
  LEFT JOIN linker 
    ON song.SongID = linker.SongID 
   and linker.CatID != 155 
   AND song.UserID = 2