SQL, объединяющий таблицы разных размеров вместе с заменой нулевого значения

#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. Почему подзапрос? Стандартное левое соединение будет работать просто отлично.