#mysql #sql #sql-server
#mysql — сервер #sql #sql-сервер #mysql
Вопрос:
Я работаю над запросом для datatable, и, похоже, я не могу заставить его отображаться так, как я хочу, я не знаю, возможно ли это вообще в SQL. То, что я хочу сделать, это получить запрос для ответа, в идеале с дополнительным столбцом логического типа.
В настоящее время я могу запустить два запроса, и они оба работают отлично, но я не могу понять, как объединить их вместе, ниже приведен код из моего первого запроса, который возвращает то, что пользователь попробовал, это работает нормально и, как ожидалось, и возвращает, как ожидалось.
SELECT *
FROM keg.beer
JOIN keg.userbeer
ON beer.id = userbeer.beer_id
WHERE userbeer.username_id = 1;
Второй запрос еще проще и представляет собой просто выбор, позволяющий получить список сортов пива.
SELECT * FROM keg.beer
Что я хочу сделать, так это запустить запрос и заставить его вернуть список сортов пива с логическим значением, пробовал пользователь его или нет.
Комментарии:
1. Каков ваш желаемый результат..
2. Стандартный список пива, который представляет собой идентификатор, название и страну с добавленным столбцом true false.
3. @teja, вероятно, действительно напился 🙂
4. Спасибо за всю помощь, ребята, это ценится
Ответ №1:
Вы не столкнетесь со слишком большим количеством сценариев для получения «желаемых результатов», которые не могут быть получены с помощью обычного SQL. В этом случае вы будете использовать оператор CASE, чтобы определить, пробовал ли человек пиво. Вам также понадобится ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ, чтобы вы не отбрасывали записи, поступающие из вашей beer
таблицы, когда в вашей отфильтрованной userid
нет userbeer
записи для этого beer
:
SELECT
beer.name,
beer.id,
beer.country,
CASE WHEN userbeer.username_id IS NULL THEN 0 ELSE 1 END AS user_tried_beer_boolean
FROM keg.beer
LEFT OUTER JOIN keg.userbeer
ON beer.id = userbeer.beer_id
AND userbeer.username_id = 1;
Как упоминал @SeanLange в комментариях здесь, ограничение оператора WHERE для идентификатора пользователя приведет к удалению записей, которые вы хотите добавить в свой результирующий набор, поэтому мы переносим ограничение username_id = 1
на ON
часть LEFT OUTER JOIN
, чтобы userbeer
результаты таблицы были ограничены только этим пользователем до его присоединения к beer
таблице.
Теперь мне нужно выпить.
Комментарии:
1. Опереди меня на пару секунд!
2. Необходимо переместить userbeer.username_id = 1 в предикат соединения, иначе левое соединение станет внутренним соединением. 🙂
3. @MisterPositive на самом деле ваш ответ был за 0,5 секунды до Jnevill
4. @SeanLange молодец! Забыл эту часть! Я обновил ответ, чтобы включить это. Спасибо!
5. LOL Я имел в виду добавление части is null
Ответ №2:
SELECT b.id,
b.name,
CASE WHEN u.username_id IS NOT NULL THEN TRUE ELSE FALSE END AS userdrankbeer
FROM keg.beer b
LEFT JOIN ( SELECT * FROM keg.userbeer WHERE username_id = 1 ) u
ON beer.id = userbeer.beer_id
;
Комментарии:
1. Почему подзапрос? Стандартное левое соединение будет работать просто отлично.