简体   繁体   中英

Count records in a MySQL table based for each record of another table

I have two tables in a MySQL database -

table_a :

+----+---------+-------------+-----------------
| id | section | sub_section | ...other_fields
+----+---------+-------------+-----------------
| 1  | A       | X           |
| 2  | A       | Y           |
| 3  | A       | Z           |
| 4  | B       | P           |
| 5  | B       | Q           |
| 6  | C       | L           |
| 7  | C       | M           |
| 8  | C       | N           |
| 9  | C       | O           |
+----+---------+-------------+-----------------

table_b :

+----+-------------+---------+-----------------
| id | sub_section | b_count | ...other_fields
+----+-------------+---------+-----------------
| 1  | X           | 1       |
| 2  | Y           | 1       |
| 3  | L           | 0       |
| 4  | P           | 1       |
| 5  | P           | 1       |
| 6  | X           | 0       |
| 7  | M           | 1       |
| 8  | Y           | 0       |
| 9  | Q           | 1       |
+----+-------------+---------+-----------------

I want to find the count of sub_section in table_b and the sum of b_count from Table B for each distinct section in table_a -

Expected Result:

+---------+--------------------+--------------+
| section | COUNT(sub_section) | SUM(b_count) |
+---------+--------------------+--------------+
| A       | 4                  | 2            |
| B       | 3                  | 3            |
| C       | 2                  | 1            |
+---------+--------------------+--------------+

One way to do this would be to run Count(section) number of queries and then combine the results.

Something like:

SELECT 'A' AS section, COUNT(sub_section), SUM(b_count) FROM table_b WHERE sub_section IN (SELECT DISTINCT sub_section FROM table_a WHERE section='A')
UNION
SELECT 'B' AS section, COUNT(sub_section), SUM(b_count) FROM table_b WHERE sub_section IN (SELECT DISTINCT sub_section FROM table_a WHERE section='B')
UNION
SELECT 'C' AS section, COUNT(sub_section), SUM(b_count) FROM table_b WHERE sub_section IN (SELECT DISTINCT sub_section FROM table_a WHERE section='C');

Is there a better way to do this in a query?

The section list in table_a is dynamic and might change and I do not want to update my query each time the values change.

SELECT t1.section, COUNT(DISTINCT t1.sub_section), SUM(t2.b_count)
FROM table_a t1
LEFT JOIN  table_b t2 USING (sub_section)
GROUP BY t1.section;

fiddle

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM