Как перекрёстно ссылаться на таблицы из select ()

0

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

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

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

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

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

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

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

Теги:

3 ответа

1
Лучший ответ

Обычно вы делаете это, перемещая условие на пользователя в положение 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
    Понятно! Таким образом, LEFT JOIN сосредотачивается на том, чтобы взять все из таблицы category но присоединяет таблицу user_category к SELECT , если user_id не существует для этой категории, он по-прежнему загружает категорию, но добавляет selected как 0 ... это прекрасно! Спасибо, Гордон!
  • 1
    @KDOT. , , Именно так. LEFT JOIN сохраняет все в первой таблице. Несоответствия во второй таблице (основанные на условии ON ) имеют NULL столбцы из этой таблицы.
Показать ещё 1 комментарий
1

Проблема заключается в том, что 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
    Это не будет делать то, что ожидает OP, когда другой пользователь выбрал категорию, но данный пользователь не сделал.
  • 0
    @GordonLinoff ты прав. Ошибка школьника! Предложение ON действительно правильное место для этого условия.
0

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

Используйте обычный запрос для получения всех активных категорий и IF EXISTS для получения выбранных категорий.

  • 0
    Я посмотрел IF EXISTS до того, как спросил, но я не могу создать новую строку в выходных данных, «selected», если она существует или не существует. Какие-либо решения?

Ещё вопросы

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