MySQL условный оператор на NULL с подзапросом - PullRequest
1 голос
/ 28 февраля 2011

Две таблицы:

user (id, myValue, ...)

user_preferred (id, userid, preferredValue) fk userid -> user(id)

Объяснение:

Пользователь - это таблица всех пользователей.user_preferred - таблица предпочтительных значений любого пользователя.Пользователь может быть указан несколько раз в user_preferred, но он должен иметь разные значения.Запрос должен возвращать всех пользователей, у которых myValue соответствует предпочтительному значению данного пользователя.$ userid - это переменная php, которую передал пользователь.

Трюк:

У пользователя не может быть предпочтений, в этом случае в таблице user_preference нет записи.,Когда приведенный выше запрос выполнен, я хочу вернуть каждого пользователя, если у данного пользователя нет предпочтений.

Аналогия:

Я нахожусь в баре и барменспрашивает меня, что я хочу пить.Я говорю, дай мне все, что у него есть, что соответствует моим предпочтениям.В первом туре я говорю, что я люблю дерьмовое пиво.Поэтому он дает мне Фостерс.Во втором раунде я говорю, что у меня нет предпочтений, и он дает мне 12 пинт, начиная от Bud Light до Гиннесса.Вместо пива это будут пользователи.Получите?

Запрос (пока):

SELECT * FROM user WHERE
IF ((SELECT preferredValue FROM user_preferred WHERE userid = $userid) IS NULL, 
   1, 
   user.myValue ANY (SELECT preferredValue FROM user_preferred WHERE userid = $userid)
)

Дополнительный трюк:

Я не хочузапустить «SELECT предпочитаемое значение из user.preferred, где id = $ userid» дважды.Можно ли сохранить результаты из первого времени выполнения и как-то использовать его вместо второго?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

SELECT *, (SELECT предпочитаемое значение ОТ user_preferred WHERE userid = $ userid) AS Результат от пользователя WHERE

IF (Результат равен NULL, 1, RESULT)

0 голосов
/ 01 марта 2011

Чтобы вернуть список пользователей:

SELECT o.*
  FROM `user` o
 WHERE o.id IN
     ( SELECT DISTINCT m.userid
         FROM user_preferred m
        WHERE EXISTS 
              ( SELECT 1 FROM user_preferred p
                 WHERE p.preferredValue = m.preferredValue 
                   AND p.userid <> m.userid 
                   AND p.userid = $userid )
     )
    OR ( o.id <> $userid AND NOT EXISTS
         ( SELECT 1
             FROM user_preferred q
            WHERE q.userid = $userid
         )
       )
...