Я заранее извиняюсь за нетехновое описание этой проблемы!
У меня есть две таблицы: UsersOptions и OptionsList..
Для простоты, OptionsList находится ниже:
UsersOptions имеет много строк, например:
Есть ли запрос, который я могу запустить, который даст мне следующий результат? (да/нет не обязательно)
Выход Джона:
Выход Мэри:
Это сводит меня с ума! Спасибо всем, кто может помочь!
Вы можете использовать оператор CASE
с EXISTS
подзапрос:
SELECT
NAME,
CASE WHEN EXISTS
(SELECT ID FROM UsersOptions
WHERE CLIENT = 'John' AND `OPTION` = OptionsList.NAME)
THEN 'y' ELSE 'n' END AS `YES/NO`
FROM
OptionsList
YES/NO
ИЗ OptionsList Большое спасибо! Я никогда даже не слышал о случае, когда существует раньше!
SELECT
o.NAME,
CASE WHEN u.OPTION IS NULL THEN 'N' ELSE 'Y' END AS 'yes/no'
FROM
OptionsList o
LEFT OUTER JOIN
UsersOptions u
ON
o.NAME = u.OPTION
WHERE
u.CLIENT = 'John'
Это будет работать для Джона (отрегулируйте или удалите предложение WHERE, как вы сочтете нужным)
SELECT t2.name AS name,
IF(t1.option IS NULL, 'y', 'n') AS value
FROM UserOptions AS t1
RIGHT JOIN OptionsList AS t2 ON (t1.option = t2.name)
WHERE t1.client = 'John'
Хотя я не понимаю, почему вы не нормализировали поле параметра в своей таблице UserOptions. Вы пошли с именем, а не id, по какой причине?
('Red', 'n')
и ('Orange', 'n')
. Чтобы заставить его работать, удалите ограничение WHERE, измените ограничение объединения на ON t1.option = t2.name AND t1.client = 'John'
и поменяйте местами порядок 'y'
и 'n'
в функции IF
.