Матчи могут иметь одинаковый старт.
blockquote>Это нарушает ограничения, которые контейнеры используют для отслеживания своих элементов.
- Вы не можете изменить порядок сортировки элемента, находящегося в контейнере. Контейнер не знает, что порядок сортировки изменился.
- Объекты должны быть разными.
Если вы прочитали документацию для
sortedset
, она четко заявляет :Хэш и общий порядок значений не должны меняться, пока они хранятся в отсортированном наборе.
blockquote>
- Там даже не существует полный порядок для ваших элементов, потому что существует
x != y
, где он не является истинным, чтоx < y
илиx > y
.- Вы вообще не упоминали
__hash__
.Я не уверен, как вы ожидаете решения этих проблем, так как я не знаком с вашим кодом, и для их решения может потребоваться некоторая редизайн. Однако эти проблемы вызывают неожиданное поведение в вашей программе.
Вам нужно нажать предложение 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;
Я думаю, подзапрос является самым простым:
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;
проверьте это:
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 ;