Как перекрёстно ссылаться на таблицы из select () - PullRequest
0 голосов
/ 28 мая 2018

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

Я хочу выбрать все текущие доступные категории, а затем добавить новую строку в результат запроса с именем selected, если пользователь уже выбрал эту категорию.

До сих пор я пробовал это:

SELECT category.*
     , user_category.user_cat_id AS 'selected' 
  FROM category
  JOIN user_category
    ON category.cat_id = user_category.category
    WHERE user_category.user_id = 1

Похоже, что выявляются только выбранные категории, а не все.

Любая помощь будетприветствуется.

Обновление: я пытался использовать левое и правое соединение, но ни одна из них не работает.Запрос возвращает только те категории, которые пользователь выбрал в данный момент.Я бы хотел, чтобы запрос возвращал все категории, но добавил бы дополнительную строку с именем selected, если пользователь выбрал ее.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Проблема в том, что ваше предложение WHERE удаляет все строки, в которых пользователь не выбрал что-то в этой категории.Попробуйте изменить свой запрос на это:

SELECT category.* , IFNULL(user_category.user_cat_id, 0) AS 'selected' 
FROM category 
LEFT JOIN user_category 
  ON category.cat_id = user_category.category 
WHERE user_category.user_id = 1 OR user_category.user_id IS NULL
0 голосов
/ 28 мая 2018

Обычно это можно сделать, переместив условие пользователя в предложение on:

SELECT c.* ,
       (CASE WHEN uc.user_id IS NULL THEN 0 ELSE 1 END) as selected'
FROM category c LEFT JOIN
     user_category uc
     ON c.cat_id = uc.category AND uc.user_id = 1;
0 голосов
/ 28 мая 2018

Соединяя две таблицы, вы получаете только те строки, для которых существует критерий объединения в обеих таблицах.Скажем, у вас есть [A, B, C, D] в таблице "category" и [A, C] в таблице "user_category", объединяя их в cat.id, вы получаете только те строки, которые содержат [A, C].

Используйте обычный запрос, чтобы получить все активные категории, и ЕСЛИ СУЩЕСТВУЕТ, чтобы получить выбранные категории.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...