2013-07-12 3 views
0

J'ai deux tables:SELECT sur deux tables - pas sûr si joindre ou union?

  1. que - qui contient bot_id et player_id
  2. bot_inventory - qui contient bot_id et item_id

Ce que je voudrais avoir la sortie d'une requête est une liste groupée par bot_id qui a un nombre de colonnes (player_id) et un autre compte (item_id). Cela ne devrait être basé que sur le bot_id trouvé dans que.

J'ai eu un aller à elle:

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` 

Mais il ne vient pas à droite:/toute aide serait grandement appréciée!

+0

Avez-vous une table de base de bots où 'bot_id' est le pk? –

+0

Quelle erreur obtenez-vous? – hd1

+0

@lc. non je ne le fais malheureusement pas. – user2504897

Répondre

3

Vous dites "ça ne sort pas bien". Je prends cela pour signifier que les valeurs retournées par l'agrégat COUNT est plus grande que prévu. La raison en est qu'une ligne de que est mise en correspondance avec plusieurs lignes de bot_inventory, et que l'agrégat COUNT va compter les lignes, et non les joueurs distincts.

Si (bot_id,player_id) est unique dans la table req, puis une solution simple au nombre des « joueurs » serait ajouter le mot-clé DISTINCT:

COUNT(DISTINCT q.player_id) as players, 

Le même schéma s'applique au compte « éléments », encore une fois, si c'est unique.

En fait, il ressemble à votre requête manque également une

GROUP BY que.bot_id 

(ce qui est le problème juergen d a souligné dans sa réponse, et je manqué que dans un premier temps.)

Sinon, vous pourrait réécrire la requête pour utiliser les vues en ligne pour obtenir les comptes, par exemple

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

votre bloc de code fonctionne parfaitement (sauf pour l'erreur où vous GROUPER q.bot_id au lieu de p.bot_id) merci beaucoup! – user2504897

+0

@ user2504897: DOH! ma faute. Une fois que vous avez trouvé l'erreur, c'était une solution facile. Vous pouvez exécuter chacune des requêtes de vue en ligne (alias q et b) pour les tests. La requête externe éliminera les lignes de b qui n'ont pas de bot_id correspondant retourné dans 'q'. – spencer7593