2010-11-10 8 views
0

Je veux savoir comment je peux écrire une requête mysql qui vérifie combien d'enregistrements existe dans l'autre table?Requête mysql qui peut être utilisée à la place mysql_num_rows

table 1 : names 

id name 
-- ---- 
4 john 
5 mike 
6 jenny 

table 2 : cars 

id name_id car 
-- ------- --- 
1 4  bmw 
2 4  wv 
3 6  honda 

query = "SELECT * FROM names WHERE id = '4'" < - dans cette requête je veux également vérifier le nombre d'enregistrements, il y a dans le tableau des voitures ou s'il y a un?

Répondre

3

Cela devrait le faire:

SELECT names.id, name, COUNT(car) as 'cars' 
FROM names LEFT JOIN cars ON names.id = cars.nameid 
WHERE names.id = '4' 
GROUP BY names.id, name 
+0

c'est plus efficace qu'en utilisant une sous-requête. – Hamish

+0

@Hamish, OP devrait essayer toutes les solutions et tirer ses conclusions à partir de là. À l'aide de SQL Server, l'exécution du groupe dans la jointure est deux fois plus rapide. –

+0

Le titre et les balises spécifient MySQL. Dans les versions actuelles de MySQL, les sous-requêtes sont * très * mal optimisées. Reportez-vous à http://www.mysqlperformanceblog.com/2010/10/25/mysql-limitations-part-3-subqueries/. D'où l'upvote. – Hamish

1

Ajouter la quantité de voitures pour chaque personne dans un LEFT OUTER JOIN

SELECT n.*, c.cnt 
FROM names n 
     LEFT OUTER JOIN (
      SELECT name_id, cnt = COUNT(*) 
      FROM cars 
      GROUP BY 
        name_id 
     ) c ON c.name_id = n.id 
WHERE ID = 4 

supplémentaire Si la performance est un problème, vous pouvez ajouter la condition à la jointure gauche au détriment de maintenabilité.

SELECT n.*, c.cnt 
FROM names n 
     LEFT OUTER JOIN (
      SELECT name_id, cnt = COUNT(*) 
      FROM cars 
      WHERE name_id = 4 -- Condition needs to be updated in two places 
      GROUP BY 
        name_id 
     ) c ON c.name_id = n.id 
WHERE ID = 4 
+0

ne savent pas ce que Ahmet Vardar attend, mais avec cette requête, il ne reçoit pas "mike" avec des voitures "0" ... je pense que la jointure à gauche que JonVD a posté serait la meilleure solution (car elle liste tous les noms, ceux sans voitures, aussi) – oezi

+0

@oezi , tu as raison, j'ai changé l'INNER à LEFT OUTER JOIN. –

1
SELECT n.*, COUNT(c.*) FROM names n, cars c WHERE n.id = 4 

Vous pouvez également nommer la colonne:

SELECT n.*, COUNT(c.*) AS `num_cars` FROM names n, cars c WHERE n.id = 4 
+1

Cela reviendrait tous les enregistrements où le cars.id = 4 pas les noms.id = 4, un changement simple si – JonVD

+0

Typo, fait la correction. Merci de l'avoir repéré. –

+0

Cela nous arrive à tous =) – JonVD

Questions connexes