代码之家  ›  专栏  ›  技术社区  ›  Tom

是否根据其他表中存在的匹配行来创建列?

  •  1
  • Tom  · 技术社区  · 15 年前

    假设我有一张桌子 人 还有一张桌子 宠物 我想展示所有有宠物的人和所有没有宠物的人。一个人既不能养宠物,也不能养任何数量的宠物。

    如果存在,我可以使用,但是我必须使用两个查询:

    select * from person where exists (select * from pet where person.id = pet.owner)
    

    和

    select * from person where not exists (select * from pet where person.id = pet.owner)
    

    有没有一种方法可以将这些数据合并到一个查询中,这样我就可以有一个人员数据列表和一个附加的列,该列说明人员是否有宠物?我不想使用group by和count,因为我不需要宠物的准确数量,只有宠物存在时才需要信息,所以我想将上述两个查询的现有数据合并到一个额外的布尔列中。

    可以这样做吗?

    2 回复  |  直到 15 年前
        1
  •  0
  •   Kalle    15 年前

    select
        p.*, 
        case when exists
                     (
                        select * 
                        from pets 
                        where personId = p.id
                     )
                     then select 1 
                     else select 0 
                     end
        as HasPets
    from person p
    

    http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

        2
  •  0
  •   Vadim    15 年前
    SELECT person.*, COUNT(pets.id)>0 AS have_pets FROM person LEFT JOIN pet ON pet.owner=person.id;