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

Матчи могут иметь одинаковый старт.

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

  • Вы не можете изменить порядок сортировки элемента, находящегося в контейнере. Контейнер не знает, что порядок сортировки изменился.
  • Объекты должны быть разными.

Если вы прочитали документацию для sortedset, она четко заявляет :

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

  • Там даже не существует полный порядок для ваших элементов, потому что существует x != y, где он не является истинным, что x < y или x > y.
  • Вы вообще не упоминали __hash__.

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

-2
задан ali_codex 21 January 2019 в 04:59
поделиться

3 ответа

Вам нужно нажать предложение 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
ответ дан sticky bit 21 January 2019 в 04:59
поделиться

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

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
ответ дан Gordon Linoff 21 January 2019 в 04:59
поделиться

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

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 ;
0
ответ дан Derviş Kayımbaşıoğlu 21 January 2019 в 04:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: