Кілька операторів вибору в одному запиті


101

Я створюю звіт у php (mysql),

колишній:

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

Ось так у мене 12 таблиць.

Чи можу я зробити це в одному запиті. Якби я? Процес відбувається повільно?


Для таблиць MyISAM існує навіть набагато кращий спосіб, дивіться мою відповідь, що швидше.
Pentium10

Відповіді:


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

Для таблиць MyISAM існує навіть набагато кращий спосіб, дивіться мою відповідь.
Pentium10

4
"Операнд повинен містити 1 стовпець (и)" - лише якщо ваші об'єднані таблиці відрізняються за кількістю стовпців. Вони повинні відповідати. 1 стовпчик на таблицю в цьому прикладі.
Зон

5
це працює лише в тому випадку, якщо ви повертаєте один вихід із кожного
Prachi

25

Якщо ви використовуєте таблиці MyISAM, найшвидшим способом є запит безпосередньо на статистику:

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

Якщо у вас є InnoDB, ви повинні запитувати з count (), оскільки повідомлене значення в information_schema.tables невірно.


1
Якщо вам цікаво, дивіться також ці відповіді про різницю між MyISAM та InnoDB .
Пол Рудьо

16

Ви, звичайно, можете нам заяву "Вибрати угода", написану Бен Джеймсом, однак це призведе до перегляду стільки стовпців, скільки таблиць. Альтернативним методом може бути такий:

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;

Приємним у такому підході є те, що ви можете явно написати оператори Union і створити представлення даних або створити таблицю темпів для зберігання значень, що додаються послідовно із викликів Proc, використовуючи змінні замість імен вашої таблиці. Я схильний більше йти з останнім, але це дійсно залежить від особистих уподобань та застосування. Якщо ви впевнені, що таблиці ніколи не змінюватимуться, ви хочете, щоб дані були у форматі одного рядка, і ви не будете додавати таблиці. дотримуйтесь рішення Бена Джеймса. В іншому випадку я б порадив гнучкість, ви завжди можете зламати структуру перехресних вкладок.


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')

12
На яке питання відповідає відповідь?
Олів

1
Це поєднання рішення Мігеля Кастанеди UNION () та рішення INFORMATION_SCHEMA Pentium10. Будь ласка, цитуйте відповіді, які ви використовуєте.
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 

1

Я знаю, що це старий стек, але я опублікую цей випадок 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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.