根据某种条件从一个表中获取所有值并从另一表中获取值

时间:2019-01-19 17:55:05

标签: mysql sql oracle

我有两个表PETPOSTPET包含id, pet_name, pet_description, pet.price和其他一些详细信息。 POSTPET和USER表之间有关系。 POSTid, 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;

POST TABLE SAMPLE DATA

PET TABLE SAMPLE DATA

3 个答案:

答案 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