Mysql 还有什么比这更好的SQL语句呢?

Mysql 还有什么比这更好的SQL语句呢?,mysql,sql,group-by,having,Mysql,Sql,Group By,Having,两个表p、W通过组外键连接。下面的内部SQL只返回表P“names”,该表在W表中只有一个匹配的“type”。外部SQL显示名称和类型列值 基本上,我只需要检索只有一种类型W的namesp 下面的语句是正确的,但是,我想知道如果没有内部SQL或其他更好的解决方案,我是否可以做到这一点 select p.name, w.type from p, w where p.name in ( select p.name from P , w where p.group = w.g

两个表p、W通过组外键连接。下面的内部SQL只返回表P“names”,该表在W表中只有一个匹配的“type”。外部SQL显示名称和类型列值

基本上,我只需要检索只有一种类型W的namesp


下面的语句是正确的,但是,我想知道如果没有内部SQL或其他更好的解决方案,我是否可以做到这一点

select p.name, w.type
from p, w
where p.name in
(
    select p.name
    from P , w 
    where p.group = w.group
    group by p.name
    having count(w.type) = 1
)
AND 
p.group= w.group

如果只有一种类型,则它也始终是最大值和最小值。因此,无需外部查询即可简化此值的检索:

select p.name, max(w.type) as type
from p
join w on p.group = w.group
group by p.name
having count(w.type) = 1
在1:n-关系中,例如,一个名称只属于一个组,因为名称是主键,所以您通常只需要按w分组;这将简化您的内部查询,与原始查询相比,它节省了一个连接,但更具通用性,例如,适用于不同的计数:

select p.name, w.type
from p, w
where p.group in
(
    select w.group
    from w 
    group by w.group
    having count(w.type) = 1
)
AND 
p.group= w.group

我想知道我是否可以在没有内部SQL的情况下做到这一点。简短回答“不可能”,因为您还需要w.type,并且您需要按p.name分组。。这需要像这样的内部查询或连接才能为w.type获取正确的数据。另一个想法是为内部查询创建一个视图,然后您可以从该视图中进行选择。感谢@RaymondNijland,我也这么认为,但可能有人有更好的解决方案。您可以开始使用更好的连接语法。停止使用where子句进行连接。请看,这可能是OP正在寻找的答案-但是这个问题的措辞非常糟糕,可能完全错误。谢谢。列“name”是表P中的主键,而不是“group”。A组;可以与许多“类型”关联。也就是说,表W可以有“组+类型”的多个组合。我的要求是获得一个“名称”,该名称只有一个“组+类型”。列名称主键和组在表P中。列组和类型在表W中。我希望我能解释得更好here@SBT感谢您对主键的澄清,我消除了答案中关于名称唯一性的不确定性。只要名称是唯一的,并且只有一个组,那么代码应该可以工作,并且应该返回与查询相同的结果。