Несколько операторов выбора в одном запросе


102

Я создаю отчет на 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

Ответы:


247
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 Agregation в соответствии с постулатом Бена Джеймса, однако в результате будет получено представление с таким количеством столбцов, сколько у вас есть таблиц. Альтернативный метод может быть следующим:

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 и сгенерировать представление или создать временную таблицу для хранения значений, которые последовательно добавляются из процедур с использованием переменных вместо имен таблиц. Я предпочитаю последнее, но это действительно зависит от личных предпочтений и применения. Если вы уверены, что таблицы никогда не изменятся, вам нужны данные в формате одной строки, и вы не будете добавлять таблицы. придерживайтесь решения Бена Джеймса. В противном случае я бы посоветовал гибкость, вы всегда можете взломать структуру кросс-таблицы.


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
На какой вопрос это отвечает?
Oliv

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.