Несколько условий ИЛИ в предложении WHERE - возвращать только одну запись
У меня есть запрос, где записи выбираются для каждого пользователя на основе 4 условий. Я хочу вернуть только одну из этих записей для каждого пользователя на основе иерархии - например: если первый критерий удовлетворен (например, gemid = 123
), не включайте больше записей для этого пользователя.
ОБНОВЛЕНИЕ согласно комментарию Op De Cirkel, я хочу исключить несколько subscribe, userid
пары
Запрос:
SELECT subscribeid, userid
FROM subscribe
WHERE (gemid=123) OR
(grade=1 AND page IS NULL AND page2 IS NULL AND gemid IS NULL ) OR
(grade=1 AND page ="page1" AND page2 IS NULL AND gemid IS NULL ) OR
(grade=1 AND page ="page1" AND page2 = "page2" AND gemid IS NULL )
1 ответ
Лучшее, что я мог выяснить, - это рассчитать, какая часть WHERE
Заявление соответствует критериям и включает его с набором результатов в качестве поля level
- и сортировать по userid, level
, Затем я могу взять первую запись для каждого пользователя в наборе результатов. Я не мог понять, как включить эту запись для каждого пользователя, не создавая временную таблицу.
На самом деле, это не какое-то решение, так как я мог бы обработать это и в php.
SELECT gemid, grade, page, page2, subscribeid, userid,
CASE WHEN (gemid=123) THEN 1 ELSE
CASE
WHEN (grade='1' AND page IS NULL AND page2 IS NULL AND gemid IS NULL ) THEN 2
ELSE
CASE
WHEN (grade='1' AND page ="page1" AND page2 IS NULL AND gemid IS NULL ) THEN 3
ELSE
CASE
WHEN (grade='1' AND page ="page1" AND page2 = "page2" AND gemid IS NULL ) THEN 4
ELSE
null
END
END
END
END level
FROM subscribe s
WHERE (gemid=123) OR
(grade='1' AND page IS NULL AND page2 IS NULL AND gemid IS NULL ) OR
(grade='1' AND page ="page1" AND page2 IS NULL AND gemid IS NULL ) OR
(grade='1' AND page ="page1" AND page2 = "page2" AND gemid IS NULL )
ORDER BY userid, level