У меня есть таблица, содержащая список категорий, из которых я хочу выбрать все. У меня есть другая таблица, содержащая категории, выбранные конкретным пользователем.
Я хочу выбрать все существующие категории, а затем добавить новую строку в результат запроса, выбранный, если пользователь уже выбрал эту категорию.
До сих пор я пробовал это:
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 и не работал. Запрос возвращает только те категории, которые пользователь выбрал в настоящий момент. Я хотел бы, чтобы запрос возвращал все категории, но добавлял дополнительную строку, выбранную, если пользователь ее выбрал.
Обычно вы делаете это, перемещая условие на пользователя в положение 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;
Проблема заключается в том, что 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
ON
действительно правильное место для этого условия.
Присоединившись к двум таблицам, вы получите только строки, для которых критерий объединения существует в обеих таблицах. Предположим, что у вас есть [A, B, C, D] в таблице "category" и [A, C] в таблице "user_category", и присоединение к ним на cat.id дает вам строки, содержащие [A, C].
Используйте обычный запрос для получения всех активных категорий и IF EXISTS для получения выбранных категорий.
LEFT JOIN
сосредотачивается на том, чтобы взять все из таблицыcategory
но присоединяет таблицуuser_category
кSELECT
, еслиuser_id
не существует для этой категории, он по-прежнему загружает категорию, но добавляетselected
как 0 ... это прекрасно! Спасибо, Гордон!LEFT JOIN
сохраняет все в первой таблице. Несоответствия во второй таблице (основанные на условииON
) имеютNULL
столбцы из этой таблицы.