mysql - 使用联合从多个表中选择计数相关行

标签 mysql sql

在本例中有三个表

4a和4b是主表

tbhari只有一个类别表

CREATE TABLE IF NOT EXISTS `4a` (
  `kd_hari` char(5),
  `kd_ruang` char(1)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `4a` (`kd_hari`,`kd_ruang`) VALUES
('a_Mon','0'),
('a_Mon','3'),
('a_Mon','P'),
('a_Mon','0'),
('b_Tue','0'),
('b_Tue','0'),
('b_Tue','P'),
('b_Tue','4'),
('c_Wed','0'),
('c_Wed','P'),
('c_Wed','2'),
('c_Wed','L'),
('d_Thu','0'),
('d_Thu','0'),
('d_Thu','3'),
('d_Thu','0'),
('e_Fri','0'),
('e_Fri','0'),
('e_Fri','0'),
('e_Fri','0');

CREATE TABLE IF NOT EXISTS `4b` (
  `kd_hari` char(5) DEFAULT NULL,
  `kd_ruang` char(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `4b` (`kd_hari`,`kd_ruang`) VALUES
('a_Mon','0'),
('a_Mon','4'),
('a_Mon','L'),
('a_Mon','0'),
('b_Tue','4'),
('b_Tue','0'),
('b_Tue','4'),
('b_Tue','0'),
('c_Wed','0'),
('c_Wed','3'),
('c_Wed','L'),
('c_Wed','0'),
('d_Thu','0'),
('d_Thu','0'),
('d_Thu','0'),
('d_Thu','0'),
('e_Fri','3'),
('e_Fri','L'),
('e_Fri','0'),
('e_Fri','0');

CREATE TABLE IF NOT EXISTS `tbhari` (
`kd_hari` char(5) DEFAULT NULL,
`hari` varchar(6) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `tbhari` (`kd_hari`, `hari`) VALUES
('a_Mon', 'Senin'),
('b_Tue', 'Selasa'),
('c_Wed', 'Rabu'),
('d_Thu', 'Kamis'),
('e_Fri', 'Jumat');

我在下面使用这个选择查询。

select a.kd_hari,hari,
(select count(kd_hari) from 4a where kd_hari=a.kd_hari)jml
from 4a a,tbhari h where a.kd_hari=h.kd_hari and kd_ruang in('L','P')
union all
select b.kd_hari,hari,
(select count(kd_hari) from 4b where kd_hari=b.kd_hari)jml
from 4b b,tbhari h where b.kd_hari=h.kd_hari and kd_ruang in('L','P')
order by kd_hari;

上面的选择查询给我结果

+---------+--------+------+
| kd_hari | hari   | jml  |
+---------+--------+------+
| a_Mon   | Senin  |    4 |
| a_Mon   | Senin  |    4 |
| b_Tue   | Selasa |    4 |
| c_Wed   | Rabu   |    4 |
| c_Wed   | Rabu   |    4 |
| c_Wed   | Rabu   |    4 |
| e_Fri   | Jumat  |    4 |
+---------+--------+------+

问题出在上表结果中,jml 列不计数取决于 kd_hari 列数据

然后,我需要如下结果。

+---------+--------+------+
| kd_hari | hari   | jml  |
+---------+--------+------+
| a_Mon   | Senin  |    2 |
| a_Mon   | Senin  |    2 |
| b_Tue   | Selasa |    1 |
| c_Wed   | Rabu   |    3 |
| c_Wed   | Rabu   |    3 |
| c_Wed   | Rabu   |    3 |
| e_Fri   | Jumat  |    1 |
+---------+--------+------+

查看 jml 列的计数 kd_hari 或 hari 数据取决于 kd_hari 或 hari 列数据。

非常感谢您的回答。

最佳答案

您的查询过于复杂,只需使用 group by 来按组获取计数。更新:由于您在 4a 和 4b 表中都有相同的键,并且您希望在一个输出中汇总它们,因此您需要一个总体总和或计数,具体取决于您使用的子查询

select kd_hari, hari, sum(rowcount) as rowcount from
    (select a.kd_hari,hari, count(a.kd_hari) as rowcount
    from 4a a,tbhari h where a.kd_hari=h.kd_hari and kd_ruang in('L','P')
    group by a.kd_hari,hari
    union all
    select b.kd_hari,hari, count(b.kd_hari) 
    from 4b a,tbhari h where a.kd_hari=h.kd_hari and kd_ruang in('L','P')
    group by a.kd_hari,hari) as t
group by kd_hari,hari

或者,将 4a 和 4b 与子查询中的 union all 结合起来,并将其连接到 tbhari 表上,这样您就可以在子查询上使用 count() 和 group by,因为子查询将包括两个表中的所有行。

但是,按照我编写示例代码的方式,您可以在连接表时利用现有索引。如果您先将它们与 union 合并,然后进行连接,则连接不会使用任何索引。

关于mysql - 使用联合从多个表中选择计数相关行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34033675/

相关文章:

PHP 递增数,每次创建一个新的div

mysql - 如何使用 Coldfusion 在 MySQL 中将 Word 文档存储为 BLOB

SQL Server 2012 安装 Reporting Services 目录错误

java - 适用于 oracle 和 HSQL 的查询

java - 如何在 JPA 查询中选择最佳匹配

php - mysql 通过新时区中的类选择 CURDATE()

php - 从服务器检索数据花费了太多时间

mysql - 部署时使用 Crystal 报表部署 clickonce windows 应用程序时出错

SQL Server 2008 连接两个查询

sql - 取消嵌套列时无法在 Presto 上转换为数组 (varchar)