2010-05-30 7 views
1

Voici une version simpliste de la table que je utilise:problème de requête Mysql

 
fruits 
+-------+---------+ 
| id | type | 
+-------+---------+ 
| 1  | apple | 
| 2  | orange | 
| 3  | banana | 
| 4  | apple | 
| 5  | apple | 
| 6  | apple | 
| 7  | orange | 
| 8  | apple | 
| 9  | apple | 
| 10 | banana | 
+-------+---------+ 

Après sont les deux questions d'intérêt:

SELECT * FROM fruits WHERE type='apple' LIMIT 2; 

SELECT COUNT(*) AS total FROM fruits WHERE type='apple'; // output 6 

Je veux combiner ces deux requêtes afin que les résultats se présente comme suit:

 
+-------+---------+---------+ 
| id | type | total | 
+-------+---------+---------+ 
| 1  | apple | 6  | 
| 4  | apple | 6  | 
+-------+---------+---------+ 

la sortie doit être limitée à 2 dossiers, mais il devrait également contenir les Tota l nombre d'enregistrements du type pomme.

Comment cela peut-il être fait avec 1 requête?

+0

quel est le but d'une telle requête? –

+0

Ceci est une version réduite d'une table que j'utilise qui aura plus d'un million d'enregistrements, et il manque 5 autres colonnes. J'ai mis cette table pour la simplicité. En ce moment j'utilise 2 requêtes, mais je me demandais comment cela peut être réalisé avec 1 requête (à des fins d'apprentissage) – Yeti

+0

On dirait que vous l'avez trop simplifié et il peut tromper ceux qui essaieront de répondre. Personnellement, je préfère les questions sensibles. –

Répondre

2
SELECT *, (SELECT COUNT(*) AS total FROM fruits WHERE type='apple') AS Total 
FROM fruits WHERE type='apple' LIMIT 2; 

Selon la façon dont MySQL interprète, il peut mettre en cache la requête interne afin qu'il ne pas réévaluer pour chaque enregistrement.

Une autre façon de le faire est avec une requête imbriquée et une jointure (ce serait utile, il vous faut plus d'un type de fruit, par exemple):

SELECT fruits.*, counts.total 
FROM fruits 
    INNER JOIN (SELECT type, COUNT(*) AS total FROM fruits GROUP BY type) counts ON (fruits.type = counts.type) 
WHERE fruits.type='apple' 
LIMIT 2; 
+0

Hey @Lost, vos 2 requêtes actuelles ne sont-elles pas plus simples que ce monstre? ;) –

+0

@col: Eh bien peut-être. Mais j'étais curieux d'apprendre à le faire avec une requête. Et oui, même si cela ne semble pas joli, je préfère utiliser 1 requête au lieu de 2. – Yeti

+0

@Lost et vous aurez tort. Il n'y a pas un seul avantage à le faire avec un. –

1

Vous devez utiliser SQL_CALC_FOUND_ROWS pour cela.

SELECT SQL_CALC_FOUND_ROWS * FROM fruits WHERE type='apple' LIMIT 2; 

renverra les ID de vos pommes, et rappelez-vous combien il serait revenu sans la clause LIMIT

SELECT FOUND_ROWS(); 

retournera combien de pommes aurait été trouvé, sans l'instruction limite.

+1

Vous devez cependant placer le SQL_CALC_FOUND_ROWS dans les commentaires conditionnels, pour permettre l'échec gracieux sur les serveurs SQL qui ne le prennent pas en charge. – Konerak