Необходимо выполнить соединение SQL между двумя таблицами и сравнить несколько разных строк - PullRequest
0 голосов
/ 26 февраля 2019

Я выполняю SQL-соединения годами, но по какой-то причине я в тупике.У меня есть две таблицы, такие как:

task:

 taskid description created_date target_date
      1 test        01-01-2019   2/1/2019
      2 test        01-01-2019   2/1/2019
      3 test        01-01-2019   2/1/2019
      4 test        01-01-2019   2/1/2019

task_tag:

 taskid tagid created date
 1      1     1/1/2019
 1      2     1/1/2019
 1      3     1/1/2019
 1      4     1/1/2019
 2      1     1/1/2019
 2      2     1/1/2019
 2      3     1/1/2019
 2      4     1/1/2019

С помощью taskid я пытаюсь запросить таблицу task_tag для taskid, которые содержат более 1 конкретного tagid.

Например, запрос может выглядеть примерно так:

SELECT tsk.task_id, tsk.description, tsk.created_date, tsk.target_date
 FROM task_tags tag
 JOIN task tsk ON tsk.task_id = tag.task_id
 WHERE tag.tag_id = 1 AND tag.tag_id = 2 AND tag.tag_id = 3

Я надеюсь на вывод, похожий на таблицу задач, однако отфильтрованный по taskid с tag.tag_id, который соответствует предложению where.Имеет смысл?

Ответы [ 2 ]

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

Вы можете попробовать:

    SELECT tsk.task_id
        , tsk.description
        , tsk.created_date
        , tsk.target_date
        , count(tag.tag_id) as tagCount FROM task tsk  JOIN   task_tags tag  ON tag.task_id = tsk.task_id 
And tag.tag_id in (1, 2, 3)
Group by tsk.task_id
        , tsk.description
        , tsk.created_date
        , tsk.target_date Having count(tag.tag_id) > 1
0 голосов
/ 26 февраля 2019

запрос таблицы task_tag для taskid, которые содержат более 1 определенного tagid

Я полагаю, что вы должны выполнить агрегацию с соответствующим предложением HAVING:

SELECT task_id
FROM task_table
GROUP BY task_id
HAVING 
    MAX(tag_id = 1) = 1
    AND MAX(tag_id = 2) = 1
    AND MAX(tag_id = 3) = 1

Этот запрос вернет task_id s, которые имеют (как минимум) tag_id 1, 2 и 3.

Конструкция MAX(tag_id = 1) использует приятную функцию MySQL, при которой условия возвращают 1, когда выполнено, и 0, если нет.Так что это на самом деле означает: по крайней мере один из tag_id из этого task_id имеет значение 1.

Если вам нужны подробности для всех этих task_id s, то вы можете просто JOIN результат этого запроса с таблицей task:

SELECT t.*
FROM task t
INNER JOIN (
    SELECT task_id
    FROM task_table
    GROUP BY task_id
    HAVING MAX(tag_id = 1) = 1 AND MAX(tag_id = 2) = 1 AND MAX(tag_id = 3) = 1
) tt ON tt.task_id = t.task_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...