mysql连接和计数

mysql连接和计数,mysql,Mysql,不知何故,我没有成功地创建我想要的查询 DB与位置有关,有以下相关表格 t\u location-位置列表,包括字段t\u location\u zipcode,以及t\u location\u id\u location t_zipcodecity-连接表只是t_zipcodecity\u zipcodecity\u id\u city t\u city-城市列表,带有t\u city\u id\u city t\u citystate-连接表,t\u citystate\u id\u城市,

不知何故,我没有成功地创建我想要的查询

DB与位置有关,有以下相关表格

  • t\u location
    -位置列表,包括字段
    t\u location\u zipcode
    ,以及
    t\u location\u id\u location
  • t_zipcodecity
    -连接表只是t_zipcodecity\u zipcodecity\u id\u city
  • t\u city
    -城市列表,带有
    t\u city\u id\u city
  • t\u citystate
    -连接表,t\u citystate\u id\u城市,t\u citystate\u id\u状态
  • t_state
    -具有t_state\u id\u state的状态列表
最初,我尝试使用此查询获取包含位置的状态列表:

SELECT DISTINCT `t_state_id_state`
      , `t_state_name_full` 
  FROM (`t_state`) 
LEFT JOIN `t_citystate` ON `t_state_id_state` = `t_citystate_id_state` 
LEFT JOIN `t_city` ON `t_citystate_id_state` = `t_city_id_city` 
LEFT JOIN `t_zipcodecity` ON `t_city_id_city` = `t_zipcodecity_id_city` 
LEFT JOIN `t_location` ON `t_zipcodecity_zipcode` = `t_location_zipcode` 
ORDER BY `t_state_name_full` asc ­
这很好用


现在,我还需要/想要的是获得每个州的位置数量,这一点令我失望。我不知道是否可以在这个查询中完成,或者我是否需要另一个查询,无论哪种方式,我都需要帮助

您可以使用计数和分组依据。大概是这样的:

SELECT DISTINCT `t_state_id_state`
          , `t_state_name_full`
          , COUNT(*) 
      FROM (`t_state`) 
 LEFT JOIN `t_citystate` ON `t_state_id_state` = `t_citystate_id_state` 
 LEFT JOIN `t_city` ON `t_citystate_id_state` = `t_city_id_city` 
 LEFT JOIN `t_zipcodecity` ON `t_city_id_city` = `t_zipcodecity_id_city` 
 LEFT JOIN `t_location` ON `t_zipcodecity_zipcode` = `t_location_zipcode` 
  GROUP BY `t_state_id_state` , `t_state_name_full`
  ORDER BY `t_state_name_full` asc

好的,这看起来不错,我的左连接不好,我最初试图得到所有的状态,这就是为什么我使用它们。但我改为使用内部联接

SELECT  t_state_id_state,
t_state_name_full,
COUNT(DISTINCT t_location_id_location) AS locations_number
FROM t_state
INNER JOIN t_citystate ON t_citystate_id_state = t_state_id_state 
INNER JOIN t_city ON t_city_id_city = t_citystate_id_city 
INNER JOIN t_zipcodecity ON t_zipcodecity_id_city = t_city_id_city 
INNER JOIN t_location ON t_location_zipcode = t_zipcodecity_zipcode 
GROUP BY t_state_id_state 
ORDER BY t_state_name_full ASC 

然后我最终得到了一个看起来不错的结果

事实并非如此,结果肯定是错误的。完整总数太高,每个州的位置数也太多(有些太高,有些太低),我建议从删除所有左连接开始,并获取一个计数,确保其正确,然后一次添加一个。这可能是因为您的数据不好,或者是您没有预料到的数据。例如,一个城市有多个城市状态id。我原则上理解你的意思,但。。。。如果我只是使用SELECT DISTINCT
t\u state\u id\u state
t\u state\u name\u full
,COUNT(*)FROM(
t\u state
)-我得到1个州和州的总数。我是否正确理解
城市
之间存在多对多关系,以及
城市
位置
之间存在另一种多对多关系?好吧,看起来不错,我的错误在于左侧连接,我最初试图得到所有的状态,这就是为什么我使用它们。但我将其更改为使用内部联接
code
SELECT  t_state_id_state,
t_state_name_full,
COUNT(DISTINCT t_location_id_location) AS locations_number
FROM t_state
INNER JOIN t_citystate ON t_citystate_id_state = t_state_id_state 
INNER JOIN t_city ON t_city_id_city = t_citystate_id_city 
INNER JOIN t_zipcodecity ON t_zipcodecity_id_city = t_city_id_city 
INNER JOIN t_location ON t_location_zipcode = t_zipcodecity_zipcode 
GROUP BY t_state_id_state 
ORDER BY t_state_name_full ASC