Давайте возьмем все строки с заданием 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