ここに長い間潜んでいて、このサイトからのアドバイスを何年も使用していて、今私は答えを見つけることができないという質問があります-しかし、解決策は簡単だと確信しています!
音楽トラックのタグ付けシステムを設定しています。私は3つのテーブルを持っています
トラック
---------------
| id | name |
---------------
| 1 | Track1 |
| 2 | Track2 |
---------------
タグリンク
--------------------------
| id | tag_id | track_id |
--------------------------
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 2 | 2 |
--------------------------
タグ
-------------------------
| id | tag | type |
-------------------------
| 1 | acoustic | genre |
| 2 | anger | mood |
-------------------------
たとえば、tag:acoustic、type:genre AND tag:anger、type:moodなどのトラックのトラック名を取得できるようにしたい。したがって、この場合、両方のタグがあるトラック1が必要です。
私が持っている現在のクエリは
SELECT tracks.name
FROM tracks
JOIN taglinks ON tracks.id=taglinks.track_id
JOIN tags ON (tags.type='genre' AND tags.tag='acoustic') AND (tags.type='mood' AND tags.tag='anger')
WHERE taglinks.tag_id=tags.id;
これは何も返しません。2番目のJOINでANDセクションを削除すると、すべてのトラックにアコースティックのタグが付けられ、ORに変更すると、両方のトラックが再び期待どおりに取得されます。
ANDを実行して、それらのタグとタイプの両方を持つトラックのみを返すにはどうすればよいですか?
よろしくお願いします:D
編集:
私が何を求めているのかを明確にするためだけに。AcousticとAngerの両方をタグとして持つトラックを取得できるようにしたいのですが、それらのタグが指定されたタイプにも一致する場合に限ります。
これは、後でタイプジャンルのジャズというタグとタイプスタイルのジャズというタグが作成される可能性があり、タグ自体だけでなく、正しいタイプのタグで選択していることを確認できる必要があるためです。
これが私が使っているsqlfiddleへのリンクです-http://sqlfiddle.com/#!2/aad82/ 3。
Gillesの答えは、これまでのところ良い解決策のようです。