这个查询出了什么问题?

时间:2011-08-02 17:08:21

标签: mysql sql

我正在选择村庄的总数,从我的表中总人口数来建立统计数据。但是,有一些问题。它返回我的一切(530 pop(共有530个pop),(106个村庄(总共有106个用户))第一行,下一行是NULL

enter image description here

SELECT s1_users.id userid, (

SELECT count( s1_vdata.wref ) 
FROM s1_vdata, s1_users
WHERE s1_vdata.owner = userid
)totalvillages, (

SELECT SUM( s1_vdata.pop ) 
FROM s1_users, s1_vdata
WHERE s1_vdata.owner = userid
)pop
FROM s1_users
WHERE s1_users.dp >=0
ORDER BY s1_users.dp DESC

4 个答案:

答案 0 :(得分:2)

尝试从内部SELECTS中删除s1_users

答案 1 :(得分:2)

您已经在使用INNER JOIN了。您列出以逗号分隔的表格,它是INNER JOIN的快捷方式。

现在,最明显的答案是使用聚合函数(COUNT和SUM)的子查询缺少GROUP BY子句。

SELECT s1_users.id userid, (

SELECT count( s1_vdata.wref ) 
FROM s1_vdata, s1_users
WHERE s1_vdata.owner = userid
GROUP BY s1_vdata.owner
)totalvillages, (

SELECT SUM( s1_vdata.pop ) 
FROM s1_users, s1_vdata
WHERE s1_vdata.owner = userid
GROUP BY s1_vdata.owner
)pop
FROM s1_users
WHERE s1_users.dp >=0
ORDER BY s1_users.dp DESC

但是,使用列列表中的子查询效率非常低。它使子查询在外部查询中为每一行运行一次。

尝试这样做

SELECT 
  s1_users.id AS userid,
  COUNT(s1_vdata.wref) AS totalvillages,
  SUM(s1.vdata.pop) AS pop
FROM
  s1_users, s1_vdata  --I'm cheating here! There's hidden INNER JOIN in this line ;P
WHERE
  s1_users.dp >= 0
  AND s1_users.id = s1_vdata.owner
GROUP BY
  s1_users.id
ORDER BY
  s1_users.dp DESC

答案 2 :(得分:0)

SELECT  s1_users.id AS userid,
        (
        SELECT  COUNT(*)
        FROM    s1_vdata
        WHERE   s1_vdata.owner = userid
        ) AS totalvillages,
        (
        SELECT  SUM(pop)
        FROM    s1_vdata
        WHERE   s1_vdata.owner = userid
        ) AS pop
FROM    s1_users
WHERE   dp >= 0
ORDER BY
        dp DESC

请注意,这比此查询效率低:

SELECT  s1_users.id AS user_id, COUNT(s1_vdata.owner), SUM(s1_vdata.pop)
FROM    s1_users
LEFT JOIN
        s1_vdata
ON      s1_vdata.owner = s1_users.id
GROUP BY
        s1_users.id
ORDER BY
        dp DESC

因为聚合需要在前者完成两次。

答案 3 :(得分:0)

SELECT userid,totalvillages,pop   from 
(
SELECT s1_users.id as userid, count( s1_vdata.wref ) as totalvillages
FROM s1_vdata, s1_users
WHERE s1_vdata.owner = userid
GROUP BY s1_users.id) tabl1 INNER JOIN
(
SELECT s1_users.id as userid, SUM( s1_vdata.pop )  as pop
FROM s1_users, s1_vdata
WHERE s1_vdata.owner = userid
GROUP BY s1_users.id) tabl2 on tabl1.userid = tabl2.userid