Instructions de sélection multiples dans une seule requête

101

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`

Comme ça, j'ai 12 tables.

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

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

Réponses:

246
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
sathish
la source
Pour les tables MyISAM, il existe même un bien meilleur moyen, voir ma réponse.
Pentium10
4
"L'opérande doit contenir 1 colonne (s)" - uniquement si vos tables fusionnées diffèrent par le nombre de colonnes. Ils devraient correspondre. 1 colonne par table dans cet exemple.
Zon le
5
cela ne fonctionne que si vous renvoyez une seule sortie de chaque sous-requête
Prachi
25

Si vous utilisez des tables MyISAM, le moyen le plus rapide est d'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 avez InnoDB, vous devez interroger avec count () car la valeur rapportée dans information_schema.tables est incorrecte.

Pentium10
la source
1
Au cas où vous vous poseriez la question, lisez également ces réponses sur la différence entre MyISAM et InnoDB .
Paul Rougieux
16

Vous pouvez certainement utiliser une instruction Select Agregation telle que postulée par Ben James, mais cela se traduira par une vue avec autant de colonnes que vous avez de tables. Une autre méthode peut ê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;

La bonne chose à propos d'une approche comme celle-ci est que vous pouvez écrire explicitement les instructions Union et générer une vue ou créer une table temporaire pour contenir des valeurs qui sont ajoutées consécutivement à partir d'un processus en utilisant des variables à la place de vos noms de table. J'ai tendance à aller plus avec ce dernier, 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, vous voulez que les données soient au format d'une seule ligne et vous n'ajouterez pas de tables. s'en tenir à la solution de Ben James. Sinon, je conseillerais la flexibilité, vous pouvez toujours pirater une structure de tabulation croisée.

Miguel Castaneda
la source
11
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')
net.tunneler
la source
12
À quelle question répond-il?
Oliv
1
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.
HoldOffHunger
2
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 
Mani
la source
1

Je sais que c'est une ancienne pile mais je publierai ce cas de sélection Multi-SQL

    SELECT bp.bizid, bp.usrid, bp.website, 
ROUND((SELECT SUM(rating) FROM ratings WHERE bizid=bp.bizid)/(SELECT COUNT(*) FROM ratings WHERE bizid=bp.bizid), 1) AS 'ratings', 
(SELECT COUNT(*) FROM bzreviews WHERE bizid=bp.bizid) AS 'ttlreviews', 
bp.phoneno, als.bizname, 
(SELECT COUNT(*) FROM endorsment WHERE bizid=bp.bizid) AS 'endorses'
, als.imgname, bp.`location`, bp.`ownership`, 
(SELECT COUNT(*) FROM follows WHERE bizid=bp.bizid) AS 'followers', 
bp.categories, bp.openhours, bp.bizdecri FROM bizprofile AS bp 
INNER JOIN alluser AS als ON bp.usrid=als.userid 
WHERE als.usertype='Business'
Niclausel
la source