SQL内连接和多行

时间:2016-06-26 20:29:52

标签: mysql sql

所以,我正在创建一个音乐数据库。 我使用三个表(文件,类别,categories_assignments)。

我希望能够选择多个类别的文件(例如,流行和摇滚的歌曲)

我已经制作了or差异(包含在下面以供参考)

SELECT DISTINCT `files`.`filename` FROM `files`
INNER JOIN `categories_assignments` 
ON `files`.`id` = `categories_assignments`.`fileid`
INNER JOIN `categories` 
ON `categories_assignments`.`catid` = `categories`.`id`
WHERE `categories`.`name` = 'rock' OR `categories`.`name`='pop';

2 个答案:

答案 0 :(得分:1)

这是一个“set-within-sets”问题 - 您正在寻找具有一组类别的歌曲。我想使用group byhaving来解决此问题:

SELECT f.filename
FROM files f JOIN
     categories_assignments ca 
     ON f.id = ca.fileid JOIN
     categories c
     ON ca.catid = c.id
WHERE c.name IN ('rock', 'pop')
GROUP BY f.filename
HAVING COUNT(*) = 2;

注意:

  • 表别名使查询更易于编写和阅读。
  • 我认为不需要在每个标识符周围添加反引号。这只会使查询更难阅读。
  • 您应该使用IN而不是多次OR比较。
  • 如果您正在学习SQL,那么SELECT DISTINCT几乎从不有用。首先学习使用GROUP BY

答案 1 :(得分:0)

按文件分组,仅采用具有两种类别的组

SELECT f.filename
FROM files f
INNER JOIN categories_assignments ca ON f.id = ca.fileid
INNER JOIN categories c ON ca.catid` = c.id
WHERE c.name in ('rock', 'pop')
GROUP BY f.filename 
HAVING count(c.name) = 2