Mysql - выбрать строки, которые имеют связанные значения - PullRequest
0 голосов
/ 11 марта 2020

Извините за плохой заголовок, не знаю, как его описать одним предложением.

Есть таблица:

id, user_id, task_id

Мне нужно выбрать user_ids, в которых есть записи с несколькими task_id Вид псевдокода

Select user_id from tasks wherehas task_id = 1 and task_id = 2

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Как говорится, есть много способов снять шкуру с кошки. Вот один из них:

Чтобы получить список пользователей, которым назначено несколько задач, и (как минимум) у них есть task_id 1 И task_id 2:

SELECT 
   user_id
FROM user_tasks // or whatever your table is called 
WHERE task_id in (1, 2)
GROUP BY user_id
HAVING COUNT(DISTINCT task_id) = 2
1 голос
/ 11 марта 2020

Давайте возьмем все строки с заданием 1 или 2, сгруппируем их по пользователям и покажем только тех пользователей, у которых минимальный идентификатор задачи отличается от максимального идентификатора задачи:

SELECT 
 user_id
FROM t 
WHERE task_id in (1, 2)
GROUP BY user_id
HAVING MIN(task_id) <> MAX(task_id)

Во всем этом вы должны понимать, что когда вы пишете предложение WHERE, оно оценивается как истинное для каждой отдельной строки. Это означает, что вы не можете сказать WHERE x = 1 AND x = 2, потому что значение X никогда не может быть одновременно 1 и 2. В ОДНОМ ЖЕ РЯДУ.

Вместо этого мы используем ИЛИ, чтобы получить все пользовательские строки, которые равны 1 или 2 и это даст нам смесь - у некоторых пользователей есть несколько строк (первая строка - 1, а следующая строка - 2). У других пользователей есть только один ряд - один или два.

User Task
John 1
Jane 1
Jane 1
Jake 1
Jake 2
Joel 2

Когда мы применяем операцию группировки, все эти строки сокращаются до одной строки на пользователя, а затем могут использоваться такие вещи, как MIN и MAX, и они имеют смысл. Для пользователя с одной строкой его MIN и MAX будут одинаковыми. Для пользователя, у которого было 20 строк со значением 1, они также будут MIN и MAX одинаковыми. Только пользователи, у которых есть хотя бы одна строка, равная 1, и другая строка, равная 2, будут иметь разные минимальные и максимальные значения:

User MIN MAX
John 1   1
Jane 1   1
Jake 1   2     <-- the only user HAVING MIN <> MAX
Joel 2   2

Минимальные и максимальные значения действительно полезны только в тех случаях, когда вы ищете для 2 разных значений. В других случаях вы можете искать COUNT DISTINCT, который содержит тот же номер, что и элементы в списке IN

0 голосов
/ 11 марта 2020

Я думаю, вы имеете в виду, что вам нужны значения user_id, для которых есть задача с task_id 1 и задача с task_id 2.

Ваше решение не работает, потому что оно ищет задачу, у которой есть task_id 1 и task_id 2 (что невозможно)

Вам нужно:

select a.user_id from tasks a where a.task_id = 1 inner join 
    tasks b where b.user_id = a.user_id and b.task_id = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...