2009-11-21 11 views
75

Je générer un rapport en php (MySQL),instructions select multiples dans la requête unique

ex:

`select count(id) as tot_user from user_table 
select count(id) as tot_cat from cat_table 
select count(id) as tot_course from course_table` 

Comme cela j'ai 12 tables.

Puis-je le faire en une seule requête. Si j'ai fait? Le processus devient lent?

+0

Pour les tables MyISAM, il existe même un bien meilleur moyen, voir ma réponse, qui est plus rapide. – Pentium10

Répondre

186
SELECT (
    SELECT COUNT(*) 
    FROM user_table 
    ) AS tot_user, 
    (
    SELECT COUNT(*) 
    FROM cat_table 
    ) AS tot_cat, 
    (
    SELECT COUNT(*) 
    FROM course_table 
    ) AS tot_course 
+1

Merci, Ses travaux – boss

+5

Ah wow, je n'ai jamais su que cette requête pourrait fonctionner. –

+0

Pour les tables MyISAM, il y a même un bien meilleur moyen, voir ma réponse. – Pentium10

10

Vous pouvez certainement utiliser l'instruction Sélectionner une agrégation telle que postulée par Ben James. Cependant, cela donnera une vue avec autant de colonnes que de tables. Une autre méthode peut être comme suit:

SELECT COUNT(user_table.id) AS TableCount,'user_table' AS TableSource FROM user_table 
UNION SELECT COUNT(cat_table.id) AS TableCount,'cat_table' AS TableSource FROM cat_table 
UNION SELECT COUNT(course_table.id) AS TableCount, 'course_table' AS TableSource From course_table; 

La bonne chose à propos d'un approch comme celui-ci est que vous pouvez écrire explicitement les déclarations de l'Union et de générer une vue ou créer une table temporaire pour contenir des valeurs qui sont ajoutés consécutivement à partir d'un Processus utilisant des variables à la place des noms de vos tables. J'ai tendance à aller plus avec ce dernier, mais cela dépend vraiment de la préférence personnelle et de l'application. Si vous êtes sûr que les tables ne changeront jamais, vous voulez que les données soient dans un format à une seule ligne, et vous n'ajouterez pas de tables. coller à la solution de Ben James. Sinon, je conseillerais la flexibilité, vous pouvez toujours pirater une barre transversale.

21

Si vous utilisez des tables MyISAM, le plus rapide est interrogeant directement les stats:

select table_name, table_rows 
    from information_schema.tables 
where 
    table_schema='databasename' and 
    table_name in ('user_table','cat_table','course_table') 

Si vous avez InnoDB vous devez interroger avec count() comme la valeur indiquée dans INFORMATION_SCHEMA.TABLES est faux.

+1

oui c'est un meilleur, +1 pour la bonne information – sathish

+0

Dans le cas où vous vous demandez, voir aussi [ces réponses sur la différence entre MyISAM et InnoDB] (https://stackoverflow.com/questions/20148/myisam-versus-innodb). –

12
select RTRIM(A.FIELD) from SCHEMA.TABLE A where RTRIM(A.FIELD) = ('10544175A') 
UNION 
select RTRIM(A.FIELD) from SCHEMA.TABLE A where RTRIM(A.FIELD) = ('10328189B') 
UNION 
select RTRIM(A.FIELD) from SCHEMA.TABLE A where RTRIM(A.FIELD) = ('103498732H') 
+8

À quelle question répond-t-on? – Oliv

Questions connexes