我有两个表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。
select pet.pet_name, post.favourite
from example.pet
left
join example.post
on pet.id = post.pet_id
where post.buyer_id = 4;
答案 0 :(得分:0)
您需要将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;
答案 1 :(得分:0)
我认为子查询最简单:
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;
答案 2 :(得分:-1)
检查此:
char** AddingToTheBook(char** original, size_t oldsize, char *number)
{
char** tmp = realloc(**original, (oldsize + 1) * sizeof(char *));
if(tmp)
{
tmp[oldsize] = malloc(strlen(number) + 1'
if(tmp[oldsize])
{
strcpy(tmp[oldsize], number);
}
else
{
/* do something for example realloc back to the old size */
tmp = NULL;
}
}
return tmp;
}
采用您的方法
char **tmp = AddingToTheBook(book, size, "Test String")
if(tmp)
{
book = tmp;
size++;
}
else
{
/* do something adding to book failed */
}
或
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