MySQL Query для отображения всех строк одной таблицы с да / нет, если совпадает с другой таблицей?

0

Я заранее извиняюсь за нетехновое описание этой проблемы!

У меня есть две таблицы: UsersOptions и OptionsList..

Для простоты, OptionsList находится ниже:

  • ИД - ИМЯ
  • 1 - Красный
  • 2 - Синий
  • 3 - Оранжевый

UsersOptions имеет много строк, например:

  • ID - КЛИЕНТ - ОПЦИЯ
  • 1 - Джон - Красный
  • 2 - Джон - Оранжевый
  • 3 - Мэри - Красный
  • 4 - Jill - Blue
  • 5 - Джилл - Оранжевый
  • и т.д..

Есть ли запрос, который я могу запустить, который даст мне следующий результат? (да/нет не обязательно)

Выход Джона:

  • ВАРИАНТ - ДА/НЕТ
  • Красный - y
  • Синий - n
  • Оранжевый - y



Выход Мэри:

  • ВАРИАНТ - ДА/НЕТ
  • Красный - y
  • Синий - n
  • Оранжевый - n

Это сводит меня с ума! Спасибо всем, кто может помочь!

  • 2
    Возможно, стоит подумать об использовании OptionsList.ID в качестве внешнего ключа для таблицы UserOptions вместо повторения строк «Red», «Orange» и «Blue».
Теги:
join

3 ответа

2

Вы можете использовать оператор 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
  • 0
    Хорошо, это работало с небольшой настройкой (КЛИЕНТ должен был пойти в верхнем запросе): ВЫБЕРИТЕ OptionsList.NAME, СЛУЧАЙ, КОГДА ЕСТЬ 'y' ELSE 'n' КОНЕЦ КАК YES/NO ИЗ OptionsList Большое спасибо! Я никогда даже не слышал о случае, когда существует раньше!
  • 0
    @ Сэм Я отредактировал свой ответ, чтобы переместить ограничение КЛИЕНТА (я явно не проснулся вчера вечером!).
1
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'
  • 0
    Это imho будет работать лучше, чем ответ Фила
  • 0
    Хорошо, я попробовал это только сейчас, но он просто возвращает единственную строку совпадений YES. Должно ли это возвращать NO для строк, которые не существуют? Спасибо!
Показать ещё 1 комментарий
0

Это будет работать для Джона (отрегулируйте или удалите предложение 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, по какой причине?

  • 0
    Это не работает Он вернет две строки ('Red', 'n') и ('Orange', 'n') . Чтобы заставить его работать, удалите ограничение WHERE, измените ограничение объединения на ON t1.option = t2.name AND t1.client = 'John' и поменяйте местами порядок 'y' и 'n' в функции IF .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню