Несколько условий ИЛИ в предложении 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
Другие вопросы по тегам