首页 > 解决方案 > 获取连接表中只有 1 个匹配行的记录?

问题描述

考虑下表:

Persons  
|id   |firstname|lastname|  
|-----|---------|--------|  
|1    |John     |Doe     |  
|2    |Jim      |Smith   |  
|3    |Jane     |Boggard |  
|4    |Joe      |Dash    |  

Licences
|p_id |licence|
|-----|-------|
|1    |car    |
|1    |bike   |
|2    |car    |
|3    |car    |
|3    |bike   |
|1    |plane  |
|4    |bike   |

如何获取许可证表中只有 1 个关联行且值为 "car" 的人?(在我们的例子中:吉姆史密斯)

谢谢

标签: mysql

解决方案


您问题的第一部分非常简单(让一个人在licenses表中只有一个关联行)。你只需做一个GROUP BY,然后HAVING COUNT(*) = 1

select
    persons.id
  ,persons.firstname
  ,Persons.lastname
from Persons
    inner join Licenses on
        Licenses.p_id = Persons.`id`
group by
    persons.id
    ,persons.firstname
    ,persons.lastname
having 
  count(*) = 1

你问题的第二部分有点小技巧:对于只有一张执照的人,他们有汽车执照。为此,您可以将过滤器应用于HAVING子句,因此它在group by. 例如(注意新的最后一行):

select
    persons.id
  ,persons.firstname
  ,Persons.lastname
from Persons
    inner join Licenses on
        Licenses.p_id = Persons.`id`
group by
    persons.id
    ,persons.firstname
    ,persons.lastname
having 
  count(*) = 1
  and min(licenses.licence) = 'car'

您正在使用该MIN函数,因为您通常需要在 HAVING 子句中应用聚合函数。但是,由于您已经知道所有这些人只有 1 个许可证,因此MIN并没有真正的不同(您甚至可以使用MAX相同的结果)。


推荐阅读