Mehrere select-Anweisungen in einer einzelnen Abfrage

101

Ich erstelle einen Bericht in 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`

So habe ich 12 Tische.

Kann ich es in einer einzigen Abfrage machen. Wenn ich es tat? Prozess wird langsam?

Boss
quelle
Für MyISAM-Tabellen gibt es sogar einen weitaus besseren Weg, siehe meine Antwort, die schneller ist.
Pentium10

Antworten:

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
quelle
Für MyISAM-Tabellen gibt es noch einen weitaus besseren Weg, siehe meine Antwort.
Pentium10
4
"Operand sollte 1 Spalte (n) enthalten" - nur wenn sich Ihre zusammengeführten Tabellen in der Anzahl der Spalten unterscheiden. Sie sollten übereinstimmen. 1 Spalte pro Tabelle in diesem Beispiel.
Zon
5
Dies funktioniert nur, wenn Sie eine einzelne Ausgabe von jeder
Unterabfrage zurückgeben
25

Wenn Sie MyISAM-Tabellen verwenden, können Sie die Statistiken am schnellsten direkt abfragen:

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

Wenn Sie InnoDB haben, müssen Sie mit count () abfragen, da der in information_schema.tables gemeldete Wert falsch ist.

Pentium10
quelle
1
Falls Sie sich fragen, lesen Sie auch diese Antworten zum Unterschied zwischen MyISAM und InnoDB .
Paul Rougieux
16

Sie können uns sicherlich die von Ben James postulierte Select Agregation-Anweisung geben. Dies führt jedoch zu einer Ansicht mit so vielen Spalten, wie Sie Tabellen haben. Eine alternative Methode kann wie folgt sein:

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;

Das Schöne an einem solchen Ansatz ist, dass Sie die Union-Anweisungen explizit schreiben und eine Ansicht generieren oder eine temporäre Tabelle erstellen können, um Werte zu speichern, die nacheinander aus einem Prozess mit Variablen anstelle Ihrer Tabellennamen hinzugefügt werden. Ich tendiere eher zu letzterem, aber es hängt wirklich von den persönlichen Vorlieben und der Anwendung ab. Wenn Sie sicher sind, dass sich die Tabellen niemals ändern werden, möchten Sie die Daten in einem einzelnen Zeilenformat und Sie werden keine Tabellen hinzufügen. bleib bei Ben James 'Lösung. Ansonsten würde ich Flexibilität empfehlen, Sie können immer eine Kreuztabellenstruktur hacken.

Miguel Castaneda
quelle
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
quelle
12
Welche Frage wird dadurch beantwortet?
Oliv
1
Dies ist eine Kombination aus der UNION () -Lösung von Miguel Castaneda und der INFORMATION_SCHEMA-Lösung von Pentium10. Bitte zitieren Sie die Antworten, die Sie verwenden.
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
quelle
1

Ich weiß, dass dies ein alter Stapel ist, aber ich werde diesen Multi-SQL-Auswahlfall veröffentlichen

    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
quelle