Wiele instrukcji wyboru w pojedynczym zapytaniu

101

Generuję raport w php (mysql),

dawny:

`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`

W ten sposób mam 12 stołów.

Czy mogę to zrobić w jednym zapytaniu. Gdybym to zrobił? Proces staje się powolny?

szef
źródło
W przypadku tabel MyISAM istnieje jeszcze lepszy sposób, zobacz moją odpowiedź, który jest szybszy.
Pentium10

Odpowiedzi:

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
satish
źródło
W przypadku stołów MyISAM jest jeszcze lepszy sposób, zobacz moją odpowiedź.
Pentium10
4
„Operand powinien zawierać 1 kolumnę (y)” - tylko wtedy, gdy scalone tabele różnią się liczbą kolumn. Powinny pasować. W tym przykładzie 1 kolumna na tabelę.
Zon
5
działa to tylko wtedy, gdy zwracasz pojedyncze wyjście z każdego zapytania podrzędnego
Prachi
25

Jeśli używasz tabel MyISAM, najszybszym sposobem jest bezpośrednie zapytanie o statystyki:

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

Jeśli masz InnoDB, musisz wykonać zapytanie z count (), ponieważ zgłoszona wartość w information_schema.tables jest nieprawidłowa.

Pentium10
źródło
1
Jeśli się zastanawiasz, zapoznaj się również z tymi odpowiedziami na temat różnicy między MyISAM a InnoDB .
Paul Rougieux
16

Z pewnością możesz użyć instrukcji Select Agregation zgodnie z postulatem Bena Jamesa, jednak spowoduje to wyświetlenie widoku z tyloma kolumnami, ile masz tabel. Alternatywną metodą może być:

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;

Zaletą takiego podejścia jest to, że możesz jawnie napisać instrukcje Union i wygenerować widok lub utworzyć tabelę tymczasową, aby przechowywać wartości, które są dodawane kolejno z procesu, używając zmiennych zamiast nazw tabel. Mam tendencję do wybierania tego drugiego, ale tak naprawdę zależy to od osobistych preferencji i zastosowania. Jeśli masz pewność, że tabele nigdy się nie zmienią, chcesz, aby dane były w formacie pojedynczego wiersza i nie będziesz dodawać tabel. trzymaj się rozwiązania Bena Jamesa. W przeciwnym razie radziłbym elastyczność, zawsze możesz zhakować strukturę krzyżową.

Miguel Castaneda
źródło
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
źródło
12
Na jakie pytanie odpowiada to?
Oliv
1
Jest to połączenie rozwiązania UNION () Miguela Castanedy i rozwiązania INFORMATION_SCHEMA Pentium10. Proszę zacytować używane odpowiedzi.
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
źródło
1

Wiem, że to stary stos, ale opublikuję ten przypadek wyboru 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
źródło