2011-08-02 119 views
0

我選擇村莊的總數,從我的餐桌上統計總人數。但是,有什麼不對。它返回我的一切(530彈出(總共有530 POP),(106個村(總共有106個用戶))在第一行,下一個行是空值這個查詢有什麼問題?

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 
+2

爲什麼你不想使用連接? –

+6

老兄,你已經在你的子查詢中使用INNER JOIN ... – ajreal

+0

請問「請不要使用INNER而不是LEFT JOIN,謝謝」是什麼意思?你想使用INNER而不是左邊,或者左邊,而不是內部?另外,給我們一個更好的要求是說如果你想顯示農村和人口的userid,或者如果你不這樣做,因爲這會影響你是否會使用內部和外部連接。 – Jason

回答

2

嘗試刪除從內SELECTS s1_users

+0

工作!........ – genesis

+0

告訴我,爲什麼它做了一個奇怪的事情,只有一個額外的不必要的表? – genesis

+0

如果您在'FROM'中放入兩個表格,就好像您在沒有連接子句的情況下加入它們!即每個第二個記錄都有第一個重複記錄 – Don

2

您已經在使用內部連接。煥你列出與逗號分隔的表,它是一個INNER JOIN快捷方式。

現在,最明顯的答案是,使用聚合函數(你的子查詢COUNT和SUM)ar缺少一個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 
+1

您不需要'GROUP BY userid'? – Dirk

+0

See!?我也忘了! :P – Mchl

+0

@genesis:是否嘗試使用或不使用GROUP BY的版本? – Mchl

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 

因爲聚集需在前兩次完成。

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