试图让一个棘手的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取消设置数组值 - 但这似乎不应该是必要的?我觉得我错过了一些简单的东西?如果绝对需要改变,表结构在这一点上并不神圣。感谢任何分享他们想法的人。
答案 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