124 votes

Plusieurs instructions de sélection dans une seule requête

Je génère un rapport en php (mysql),

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`

J'ai ainsi 12 tables.

Puis-je le faire en une seule fois ? Si c'est le cas ? Le processus devient-il lent ?

0 votes

Pour les tables MyISAM, il existe même une bien meilleure méthode, voir ma réponse, qui est plus rapide.

286voto

sathish Points 2419
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

0 votes

Pour les tables MyISAM, il existe même une bien meilleure solution, voir ma réponse.

5 votes

"L'opérande doit contenir 1 colonne(s)" - uniquement si vos tables fusionnées diffèrent en termes de nombre de colonnes. Elles doivent correspondre. 1 colonne par table dans cet exemple.

6 votes

Cela ne fonctionne que si vous renvoyez un seul résultat pour chaque sous-requête

25voto

Pentium10 Points 68884

Si vous utilisez des tables MyISAM, la méthode la plus rapide consiste à interroger directement les statistiques :

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 utilisez InnoDB, vous devez effectuer une requête avec count(), car la valeur indiquée dans information_schema.tables est erronée.

2 votes

Au cas où vous vous poseriez la question, voir aussi ces réponses sur la différence entre MyISAM et InnoDB .

19voto

Vous pouvez certainement utiliser l'instruction Select Agregation comme l'a suggéré Ben James, mais vous obtiendrez alors une vue comportant autant de colonnes que de tables. Une autre méthode pourrait être la suivante :

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;

L'avantage d'une telle approche est que vous pouvez écrire explicitement les instructions d'union et générer une vue ou créer une table temporaire pour contenir les valeurs qui sont ajoutées consécutivement à partir d'un processus en utilisant des variables à la place des noms de table. J'ai tendance à opter pour cette dernière solution, mais cela dépend vraiment des préférences personnelles et de l'application. Si vous êtes sûr que les tables ne changeront jamais, que vous voulez les données dans un format à une seule ligne et que vous n'ajouterez pas de tables, optez pour la solution de Ben James. Sinon, je vous conseille la flexibilité, vous pouvez toujours pirater une structure à onglets croisés.

11voto

net.tunneler Points 61
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')

12 votes

Quelle est la réponse à cette question ?

1 votes

Il s'agit d'une combinaison de la solution UNION() de Miguel Castaneda et de la solution INFORMATION_SCHEMA de Pentium10. Veuillez citer les réponses que vous utilisez.

6voto

Mani Points 810
SELECT t1.credit, 
       t2.debit 
FROM   (SELECT Sum(c.total_amount) AS credit 
        FROM   credit c 
        WHERE  c.status = "a") AS t1, 
       (SELECT Sum(d.total_amount) AS debit 
        FROM   debit d 
        WHERE  d.status = "a") AS t2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X