MySQL:基于子查询的相关子查询获取行计数
我很抱歉,如果这个问题在其他地方得到了回答,我一直在努力寻找,但还没有找到任何东西 我有以下表格:MySQL:基于子查询的相关子查询获取行计数,mysql,count,correlated-subquery,Mysql,Count,Correlated Subquery,我很抱歉,如果这个问题在其他地方得到了回答,我一直在努力寻找,但还没有找到任何东西 我有以下表格: Table: STATES +------------+---------+ | name | stateID | +------------+---------+ | Florida | FL | | California | CA | | New Jersey | NJ | +------------+---------+ Table:
Table: STATES
+------------+---------+
| name | stateID |
+------------+---------+
| Florida | FL |
| California | CA |
| New Jersey | NJ |
+------------+---------+
Table: AREAS
+-------+---------+-------+
| name | stateID | locID |
+-------+---------+-------+
| Area1 | FL | 1 |
| Area2 | FL | 1 |
| Area3 | FL | 2 |
| Area4 | NJ | 3 |
| Area5 | NJ | 3 |
| Area6 | NJ | 4 |
| Area7 | CA | 5 |
| Area8 | CA | 6 |
| Area9 | CA | 7 |
+-------+---------+-------+
Table: LOCATIONS
+----------+-------+
| name | locID |
+----------+-------+
| Orlando | 1 |
| Brevard | 2 |
| North NJ | 3 |
| South NJ | 4 |
| B Hills | 5 |
| East LA | 6 |
| SanFran | 7 |
+----------+-------+
我想要得到的结果是:
| STATES.name | LOCATIONS.name | COUNT(locations in state) | AREAS.name
我可以很容易地得到除了计数以外的所有信息,但我无法得到每个州有多少个位置。看起来这应该是一件简单的事情,我只是错过了什么吗
以下是我一直在处理的问题:
SELECT
STATES.name AS state
,LOCATIONS.name AS location
,AREAS.name AS area
,(SELECT
COUNT(*)
FROM
(SELECT
areaID
FROM
AREAS
WHERE
AREAS.stateID = STATES.stateID
GROUP BY
AREAS.locID
) AS area_count
) AS row_count
FROM
STATES
LEFT JOIN AREAS ON STATES.stateID = AREAS.stateID
LEFT JOIN LOCATIONS ON AREAS.locID = LOCATIONS.locID;
当然,这会失败,因为子查询1中没有任何STATES.stateID供子查询2引用。我已经尝试通过JOIN
ing子查询1中的表传递stateID,以及JOIN
在子查询2中传递stateID,而不是尝试在WHERE
语句中引用它。如果子查询2的整个部分是子查询1的WHERE
语句的一部分,则此操作也会失败
我还尝试隔离查询,只提取区域。stateID
和计数(州内的位置)
,但没有效果,我一直获取州内的区域数,而不是位置数:
select AREAS.stateID
, COUNT(AREAS.locID)
FROM AREAS group by AREAS.stateID
将一个
不同的
抛入计数()
会让我更接近,但有些值仍然处于关闭状态,不确定从何处获取数字,因为它们与所有情况下的位置数不匹配,但如果我理解正确,大多数…:
- 每个州都有很多地方 (一对多关系)
- 每个地点都有许多区域 (一对多关系)
Location
中应该有一个stateID
,作为tableState
的外键
而且在表区域中应该不需要stateID
那么,你可以:
SELECT
s.name AS stateName
, l.name AS locationName
, locgrp.locCnt AS locationsInState
, a.name AS areaName
FROM STATES s
JOIN LOCATIONS l
ON s.stateID = l.stateID
JOIN AREAS a
ON a.locationID = l.locationID
LEFT JOIN
( SELECT stateID
, COUNT(*) AS locCnt
FROM LOCATIONS
GROUP BY stateID
) locgrp
ON s.stateID = locgrp.stateID
如果将某些位置划分为处于不同状态的区域,则您的设计似乎没有问题。使用以下命令:
SELECT
STATES.name AS state
, LOCATIONS.name AS location
, AREAS.name AS area
, locgrp.locCnt AS locationsInState
FROM STATES
LEFT JOIN AREAS
ON STATES.stateID = AREAS.stateID
LEFT JOIN LOCATIONS
ON AREAS.locID = LOCATIONS.locID
LEFT JOIN
( SELECT stateID
, COUNT(DISTINCT locID) AS locCnt
FROM AREAS
GROUP BY stateID
) AS locgrp
ON STATES.stateID = locgrp.stateID
或者(与您尝试的类似):
将给出输出:
state locname locs areaname
Florida Orlando 2 Area1
Florida Brevard 1 Area3
New Jersey North NJ 2 Area4
New Jersey South NJ 1 Area6
California B Hills 1 Area7
California East LA 1 Area8
California SanFran 1 Area9
但是,如果需要列出的每个区域,请使用查询:
SELECT s.state AS state,
l.name AS locname,
( SELECT count( a1.name ) FROM areas a1
WHERE a1.locID = a.locID
AND a1.stateID = a.stateID ) AS locs,
a.name
FROM areas a
JOIN locations l ON a.locID = l.locID
JOIN states s ON s.stateID = a.stateID
这将为您提供输出:
state locname locs areaname
Florida Orlando 2 Area1
Florida Orlando 2 Area2
Florida Brevard 1 Area3
New Jersey North NJ 2 Area4
New Jersey North NJ 2 Area5
New Jersey South NJ 1 Area6
California B Hills 1 Area7
California East LA 1 Area8
California SanFran 1 Area9
每个地方都属于一个州,而且只有一个州,对吗?那么,为什么Locations
表没有stateID
(作为外键)?您可以使用表中的数据显示示例输出吗?如果将“密西西比河”位置拆分为不同州的区域,您可能会遇到问题。@piotm:我假设州和位置之间存在一对多的关系。如果关系是多对多的,那么还需要另一个中间表(StateLocation)。@piotm,@WuLongTi:如果一个位置可以划分为不同状态的区域,那么您的设计似乎就可以了。中间的表实际上是您的“区域”表。我将添加一个不同的答案/问题。@ypercube:sigh。。如此接近。当我运行you's second查询时,我在“on子句”中得到了1054-未知列“STATE.stateID”;和#1054-运行第三个时,'where子句'
中的未知列'a.stateID'。我也看到过同样令人沮丧的错误。叹息。。。不过,你的假设是正确的,有些地方的服务区域跨越州界线。。另一方面,我可以利用实际位置表中的地址字段…@WuLongTi:Typos。已修复,请重试。不确定示例中的“LOC”是什么。。。虽然我需要的是州内的位置总数,所以我需要的是州内的位置总数,所以给给给我的样本数据,我需要的是我需要的样本数据我需要的样本数据,我需要的是,我需要的是州内的位置的总数,所以给国家的位置的总数,这样给给给了我的样本数据我需要的样本数据,我需要的是我需要的样本数据,我需要的,我需要的,我需要的是:我需要的样本数据,我需要的样本数据::::::::124;FL124;FL|佛罗里达124奥兰兰兰兰兰奥兰兰多,奥兰兰兰多,奥兰兰兰多,奥兰兰兰多,奥奥兰多,奥兰多,3 124,奥兰兰兰多,3 1243 124,3 1243,地区2,地区2,3,地区2,地区2,地区2,地区2,地区2,地区2,地区2,地区,| E.LA | 3 |区域8 | CA | SanFran | 3 |区域9如果有任何混淆,请道歉
SELECT s.state AS state,
l.name AS locname,
( SELECT count( a1.name ) FROM areas a1
WHERE a1.locID = a.locID
AND a1.stateID = a.stateID ) AS locs,
a.name
FROM areas a
JOIN locations l ON a.locID = l.locID
JOIN states s ON s.stateID = a.stateID
state locname locs areaname
Florida Orlando 2 Area1
Florida Orlando 2 Area2
Florida Brevard 1 Area3
New Jersey North NJ 2 Area4
New Jersey North NJ 2 Area5
New Jersey South NJ 1 Area6
California B Hills 1 Area7
California East LA 1 Area8
California SanFran 1 Area9