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