Mysql 是否从其他表中存在的匹配行创建列?

Mysql 是否从其他表中存在的匹配行创建列?,mysql,Mysql,假设我有一个桌子上的人和一个桌子上的宠物,我想显示所有有宠物的人和所有没有宠物的人。一个人可以没有宠物,也可以有任意数量的宠物 我可以使用IF EXISTS,但我必须使用两个查询: select * from person where exists (select * from pet where person.id = pet.owner) 及 有没有一种方法可以在一个查询中组合这些数据,这样我就可以得到一个包含个人数据的列表,再加上一个列,显示这个人是否有宠物?我不想使用group by和

假设我有一个桌子上的人和一个桌子上的宠物,我想显示所有有宠物的人和所有没有宠物的人。一个人可以没有宠物,也可以有任意数量的宠物

我可以使用IF EXISTS,但我必须使用两个查询:

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

有没有一种方法可以在一个查询中组合这些数据,这样我就可以得到一个包含个人数据的列表,再加上一个列,显示这个人是否有宠物?我不想使用group by和count,因为我不需要宠物的实际数量,只需要有宠物时的信息,所以我想将上述两个查询的现有数据合并到一个额外的布尔列中

有可能这样做吗

替代解决方案

SELECT person.*, COUNT(pets.id)>0 AS have_pets FROM person LEFT JOIN pet ON pet.owner=person.id;

可以但是COUNT语句对所有匹配行进行计数,这正是我想要避免的,因为EXISTS在第一个匹配行之后会停止处理同一所有者的进一步匹配。但是由于左连接和COUNT必须大于0的子句的组合,它实际上为您提供了所需的COUNTPET结果。id>0将要么给true,要么给false,要么给1,要么给0这看起来不错,尽管它在mysql命令行中给了我一个语法错误。可能是我的输入错误,还在检查……看起来CASE只能在存储过程中使用,不能在简单的查询中使用。真遗憾。因为这正是我所需要的,但我目前不使用存储过程。这可能也是我的一个输入错误,我手头没有mysql安装来尝试它。你是魔鬼:-这是我见过的最特别的解决方案。顺便说一句:在select语句中也可以使用CASE。它确实可以使用一些语法更改:select people.*,CASE when exists select*from pets where pets.person=people.id,然后1 else 0结束,因为它有来自people的pet;
SELECT person.*, COUNT(pets.id)>0 AS have_pets FROM person LEFT JOIN pet ON pet.owner=person.id;
select
    p.*, 
    case when exists
                 (
                    select * 
                    from pets 
                    where personId = p.id
                 )
                 then select 1 
                 else select 0 
                 end
    as HasPets
from person p