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

将一个
不同的
抛入
计数()
会让我更接近,但有些值仍然处于关闭状态,不确定从何处获取数字,因为它们与所有情况下的位置数不匹配,但如果我理解正确,大多数…

  • 每个州都有很多地方 (一对多关系)

  • 每个地点都有许多区域 (一对多关系)
因此,在table
Location
中应该有一个
stateID
,作为table
State
的外键

而且在表
区域中应该不需要
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