COUNT(*) from multiple tables in MySQL

MysqlCount

Mysql Problem Overview


How do I go about selecting COUNT(*)s from multiple tables in MySQL?

Such as:

SELECT COUNT(*) AS table1Count FROM table1 WHERE someCondition
JOIN?? 
SELECT COUNT(*) AS table2Count FROM table2 WHERE someCondition
CROSS JOIN? subqueries?
SELECT COUNT(*) AS table3Count FROM table3 WHERE someCondition

Edit:

The goal is to return this:

+-------------+-------------+-------------+
| table1Count | table2Count | table3Count |
+-------------+-------------+-------------+
| 14          | 27          | 0           |
+-------------+-------------+-------------+

Mysql Solutions


Solution 1 - Mysql

You can do it by using subqueries, one subquery for each tableCount :

SELECT
  (SELECT COUNT(*) FROM table1 WHERE someCondition) as table1Count, 
  (SELECT COUNT(*) FROM table2 WHERE someCondition) as table2Count,
  (SELECT COUNT(*) FROM table3 WHERE someCondition) as table3Count

Solution 2 - Mysql

You can do this with subqueries, e.g.:

select (SELECT COUNT(*) FROM table1 WHERE someCondition) as table1Count, 
       (SELECT COUNT(*) FROM table2 WHERE someCondition) as table2Count 

Solution 3 - Mysql

Here is simple approach to get purely the row counts from multiple tables, if there are no conditions on specific tables.

Note:

For InnoDB this count is an approximation. However, for MyISAM the count is accurate.

Quoted from the docs:

> The number of rows. Some storage engines, such as MyISAM, store the > exact count. For other storage engines, such as InnoDB, this value is > an approximation, and may vary from the actual value by as much as 40% > to 50%. In such cases, use SELECT COUNT(*) to obtain an accurate > count.

Using the information_schema.tables table you can use:

SELECT 
    table_name, 
    table_rows
FROM 
    information_schema.tables
WHERE
    table_name like 'my_table%';
Output:
table_name    table_rows
my_table_1    0
my_table_2    15
my_table_3    30

Solution 4 - Mysql

You can use UNION

  SELECT COUNT(*) FROM table1 WHERE someCondition
  UNION
  SELECT COUNT(*) FROM table2 WHERE someCondition
  UNION
  SELECT COUNT(*) FROM table3 WHERE someCondition

Solution 5 - Mysql

You can do this in this way.

SELECT (select count(*) from table1) + (select count(*) from table2) as total_rows

You can add as many tables as you want.

Solution 6 - Mysql

Try changing to:

SELECT 
    COUNT(table1.*) as t1,
    COUNT(table2.*) as t2,
    COUNT(table3.*) as t3 
FROM table1 
    LEFT JOIN tabel2 ON condition
    LEFT JOIN tabel3 ON condition

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbcmcfcView Question on Stackoverflow
Solution 1 - MysqlJulien HoarauView Answer on Stackoverflow
Solution 2 - MysqlD'Arcy RittichView Answer on Stackoverflow
Solution 3 - MysqlS3DEVView Answer on Stackoverflow
Solution 4 - MysqlInterfectorView Answer on Stackoverflow
Solution 5 - MysqlAtul TripathiView Answer on Stackoverflow
Solution 6 - MysqlPramendra GuptaView Answer on Stackoverflow