mysql - 获取连接表中只有 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" 的人?(在我们的例子中:吉姆史密斯)
谢谢
解决方案
您问题的第一部分非常简单(让一个人在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
相同的结果)。
推荐阅读
- java - 使用 SQLite 在 Java 中使用数据库时出错
- python - 使用线性方程创建径向插值圆
- spring-security - Spring security oauth2登录和资源服务器在同一个应用程序中
- python - Django 测试 - 当我运行 classB(它是 classA 的子类)时,classA 中的测试失败
- typo3-9.x - TYPO3 - 如果存储超出根页面导致错误“请求的页面不存在”,则 tx_news 说出 URL 路由
- python - 基于硒的python函数在托管时在本地正确失败?
- string - VHDL:将循环变量转换为字符串并传递给 GENERIC
- neo4j - Neo4j Cypher - 如何使用公共节点显示某种类型的所有节点的图形?
- openmdao - 你能在 OpenMDAO N2 图中隐藏求解器吗
- sql - 在外部数据库上更新时存储过程中出现令牌未知错误