2013-07-12 64 views
0

我有兩個表:跨兩個表選擇 - 不確定是否加入或聯合?

  1. 闕 - 包含bot_idplayer_id
  2. bot_inventory - 包含bot_iditem_id

我想什麼有從查詢輸出分組名單由具有一個列計數(player_id)和另一個計數(`item_id)的bot_id's組成。這應該只基於在que中找到的bot_id。

我在它有一個去:

SELECT `que`.`bot_id`, 
     Count(`que`.`player_id`)   AS players, 
     Count(`bot_inventory`.`item_id`) AS items 
FROM `que` 
     LEFT JOIN `bot_inventory` 
       ON `que`.`bot_id` = `bot_inventory`.`bot_id` 
ORDER BY `que`.`bot_id` 

但它不出來的權利:/任何幫助,將不勝感激!

+0

你有一個基地機器人表,其中'bot_id'是PK? –

+0

你得到什麼錯誤? – hd1

+0

@lc。不,我不幸。 – user2504897

回答

3

你說「這不是正確的」。我認爲這意味着由COUNT彙總返回的值比您預期的要大。其原因是從que開始的一行與bot_inventory中的多個行匹配,並且COUNT聚合將對行進行計數,而不是對不同的玩家進行計數。

如果(bot_id,player_id)是在闕臺獨一無二的,那麼一個簡單的解決了「玩家」計數將被添加DISTINCT關鍵字:再次

COUNT(DISTINCT q.player_id) as players, 

相同的模式適用於「項​​目」算,如果那是獨一無二的。

事實上,它看起來像你的查詢也少了一種

GROUP BY que.bot_id 

(這是問題于爾根·d在他的回答中指出,我錯過了在第一。)

否則,可以重寫查詢以使用內聯視圖來獲取計數,例如

SELECT q.bot_id 
    , q.players 
    , b.items 
    FROM (SELECT p.bot_id, COUNT(p.player_id) AS players 
      FROM que p 
      GROUP BY p.bot_id 
     ) q 
    LEFT 
    JOIN (SELECT d.bot_id, COUNT(d.item_id) AS items 
      FROM bot_inventory d 
      GROUP BY d.bot_id 
     ) b 
    ON b.bot_id = q.bot_id 
ORDER BY q.bot_id 
+0

你的代碼塊完美地工作(除了你的GROUP BY q.bot_id而不是p.bot_id的一個錯誤)非常感謝你! – user2504897

+0

@ user2504897:DOH!我的錯。一旦你發現錯誤,這是一個簡單的修復。您可以運行每個內聯視圖查詢(別名爲q和b)進行測試。外部查詢將消除b中沒有匹配'q'中返回的bot_id的行。 – spencer7593