Получить все значения из одной таблицы и получить значения из другой таблицы на основе некоторого условия - PullRequest
0 голосов
/ 19 января 2019

У меня есть две таблицы, PET и POST. PET содержит id, pet_name, pet_description, pet.price и несколько других деталей. POST имеет отношение между PET и таблицей USER. POST имеет id, pet_id, buyer_id, favourite столбцов.

Если пользователь пометит питомца как своего любимого, запись будет добавлена ​​в таблицу POST. Теперь мое требование состоит в том, чтобы получить все домашние животные, и если у данного пользователя есть 2 домашних животных, помеченных как его любимые, то флаг со значением true для этих двух домашних животных и значением «false» для других домашних животных.

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

select pet.pet_name, post.favourite 
  from example.pet 
  left 
  join example.post 
    on pet.id = post.pet_id 
 where post.buyer_id = 4;

POST TABLE SAMPLE DATA

PET TABLE SAMPLE DATA

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вам нужно вставить предложение po1.buyer_id = 4 в ON левого соединения.В WHERE он фильтрует все строки, в которых не найдена соответствующая запись в post, следовательно, вы не получаете всех домашних животных.

Чтобы проверить, выбрал ли пользователь ровно двух домашних животных, вы можете использоватькоррелированный подзапрос, получающий количество фаворитов пользователя.

SELECT pe1.name,
       coalesce(po1.favourite, 0)
       FROM example.pet pe1
            LEFT JOIN example.post po1
                      ON po1.pet_id = pe1.id
                         AND po1.buyer_id = 4
       WHERE (SELECT count(*)
                     FROM example.post po2
                     WHERE po2.buyer_id = po1.buyer_id
                           AND po2.favourite = 1) = 2;
0 голосов
/ 19 января 2019

Я думаю, что подзапрос является самым простым:

select p.*,
       (case when exists (select 1
                          from posts po
                          where po.pet_id = p.id and po.buyer_id = 4
                         )
             then 1 else 0
        end) as is_favorite
from pets p;
0 голосов
/ 19 января 2019

проверьте это:

select pet.pet_name, 
  case when (select sum(favorite) from petquest.post where pet.id = post.pet_id) > 1 then 'true' else 'false' end as favstat
from petquest.pet

с вашим подходом

select pet.pet_name
     , CASE WHEN sum(post.favourite) > 1 THEN 'True' else 'False' end as favstat

  from example.pet 
  inner join example.post 
    on pet.id = post.pet_id 
 group by pet.pet;

или

 select pet.pet_name
     , CASE WHEN (sum(post.favourite) over (partition by pet.pet_name)) > 1 THEN 'True' else 'False' end as favstat
  from example.pet 
  inner join example.post 
    on pet.id = post.pet_id ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...