2016-06-26 14 views
0

ですから、私は音楽データベースを作成しています。 私は3つのテーブル(ファイル、カテゴリ、categories_assignments)を使用しています。SQL内部結合と複数行で

私は複数のカテゴリにあるファイル(ポップとロックの両方で例えば曲)を選択することができるようにしたい

私はすでに(参考のために以下に含ま)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'; 
を行っています
+0

質問は? ... – scaisEdge

答えて

1

を取る - あなたは曲を探していますこれらのカテゴリには一連のカテゴリがあります。私は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; 

注:

  • 表の別名を書くことや読むことをクエリが容易になります。
  • 私はすべての識別子の周りにバックティックを入れる必要はありません。これで、クエリを読みにくくするだけです。
  • ORの比較の代わりにINを使用する必要があります。
  • SQLを学習している場合、SELECT DISTINCTはほとんど役に立たないです。最初にGROUP BYを使用する方法を学んでください。
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 
関連する問題