2013-02-08 48 views
0

如果我使用此查詢:MYSQL,從兩個表中選擇,計數,出現異常

SELECT map.x,map.y,users.username,Count(username) as count 
FROM map LEFT JOIN users ON (map.x=users.x AND map.y=users.y) 
WHERE map.y BETWEEN 0 AND 2 AND map.x BETWEEN 0 AND 2 
GROUP BY map.x,map.y 
ORDER BY map.y DESC,map.x 

我得到這樣的結果:

enter image description here

(原圖:http://i.stack.imgur.com/3AOgH.png

(我不需要用戶名,這裏只是爲了解釋) 但我不想數例如「valaki」,所以我woul倒要得到這樣一個結果:

http://i.stack.imgur.com/URGFs.png

(原圖:http://i.stack.imgur.com/URGFs.png

但有了這個代碼,我得到成才完全不同:

SELECT map.x,map.y,users.username,Count(username) as count 
FROM map LEFT JOIN users ON (map.x=users.x AND map.y=users.y) 
WHERE map.y BETWEEN 0 AND 2 AND map.x BETWEEN 0 AND 2 AND users.username!='valaki' 
GROUP BY map.x,map.y 
ORDER BY map.y DESC,map.x 

此:

http://i.stack.imgur.com/pO1Iy.png

(原圖:http://i.stack.imgur.com/pO1Iy.png

如果有人能解決我的查詢(其中球員都沒有「valaki」,但我需要那些在那裏沒有人是那些地方),我會很高興。謝謝!

回答

0

試試這個,

SELECT map.x, map.y, 
     users.username, 
     Count(username <> 'valaki') as totalCount 
FROM map 
     LEFT JOIN users 
      ON map.x=users.x AND map.y=users.y 
WHERE map.y BETWEEN 0 AND 2 AND map.x BETWEEN 0 AND 2 
GROUP BY map.x,map.y 
ORDER BY map.y DESC, map.x 

記住Count(username <> 'valaki')僅在mysql是有效的,如果你碰巧嘗試在其他RDBMS,你可以像這樣做,

COUNT(CASE WHEN username <> 'valaki' THEN 1 ELSE NULL END) 
+0

好的,謝謝! :) – RaNdOmNaMe 2013-02-08 16:05:13

+0

不客氣':D'。 – 2013-02-08 16:07:05

0

我想你應該嘗試這樣的事情:

select map.x, map.y, group_concat(users.username), 
     sum(case when username <> 'valaki' then 1 else 0 end) as SumNoValaki 
from map left join 
    users 
    ON map.x=users.x AND map.y=users.y 
WHERE map.y BETWEEN 0 AND 2 AND map.x BETWEEN 0 AND 2 
GROUP BY map.x,map.y 
ORDER BY map.y DESC, map.x 

您的查詢任意ç提供一個用戶名放在每一行上。你不想看到他們嗎?

0

剛剛嘗試查詢波紋管,你只需要添加 「AND users.username IS NOT NULL AND COUNT(用戶名)> 1」 到你的where語句。

它會讓你清楚你需要檢查的數據結果。

SELECT map.x,map.y,users.username,Count(username) as count 
FROM map LEFT JOIN users ON (map.x=users.x AND map.y=users.y) 
WHERE map.y BETWEEN 0 AND 2 AND map.x BETWEEN 0 AND users.username IS NOT NULL AND COUNT(username) > 1 
GROUP BY map.x,map.y 
ORDER BY map.y DESC,map.x 
0

嘗試:

SELECT map.x,map.y,users.username,Count(username) as count 
FROM map 
LEFT JOIN users ON (map.x=users.x AND map.y=users.y AND users.username!='valaki') 
WHERE map.y BETWEEN 0 AND 2 AND map.x BETWEEN 0 AND 2 
GROUP BY map.x,map.y 
ORDER BY map.y DESC,map.x