mysql объединяет и получает строки, в которых установлены два значения или нет значения вообще - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть две таблицы:

таблица "песен"

|id|title |
|1 |song 1|
|2 |song 2|
|3 |song 3|

таблица "тегов"

|id|song_id|type  |tag      |
|1 |1      |season|christmas|
|2 |1      |time  |morning  |
|3 |2      |season|summer   |
|4 |2      |time  |morning  |
|5 |2      |time  |night    |
|6 |3      |time  |morning  |

Например, у меня есть три тега типа "сезон ":" рождество "," пасха "," валентинка ".У меня также есть теги типа «дневное время»: «утро», «день», «вечер» и «ночь».Как я могу получить все песни, у которых есть тег типа «сезон» и тег «рождество» или вообще нет типа «сезон»?Но могут быть и другие типы тегов.

Я написал это:

SELECT s.title,t.* FROM songs AS s LEFT JOIN tags AS t ON s.id=t.song_id WHERE (t.type='season' AND t.tag='christmas') OR type ... ?

, но я не знаю, как создать остальную часть этого запроса, чтобы тип «сезон» был пустым, но могут быть и другие типы.

Пример: запрос 1: искать песни с тегами сезона = рождество и время = утро.запрос 2: песни без тега сезона и только время = ночь

Надеюсь, вы понимаете, чего я пытаюсь достичь.

1 Ответ

0 голосов
/ 27 февраля 2019

Ваш первый запрос:

   Select s1.id, s1.title, s1.type as "type1", s1.tag as "tag1", s2.type as "type2", s2.tag as "tag2" From (SELECT songs.id, songs.title, tags.type, tags.tag FROM songs JOIN tags ON songs.id=tags.song_id WHERE (tags.type='season' AND tags.tag='christmas')) as s1 Join (SELECT songs.id, songs.title, tags.type, tags.tag FROM songs JOIN tags ON songs.id=tags.song_id WHERE (tags.type='time' AND tags.tag='morning')) as s2 ON s1.id = s2.id

Ваш второй запрос:

   SELECT songs.id, songs.title, tags.type, tags.tag FROM songs JOIN tags ON songs.id=tags.song_id WHERE tags.type='time' and tags.tag='morning' and songs.id not in (SELECT song_id FROM tags WHERE tags.type ='season')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...