Mysql 使用union从多个表中选择计数相关行

Mysql 使用union从多个表中选择计数相关行,mysql,sql,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'

在本例中,有三个表

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表中的union all连接起来,这样子查询中就可以使用count()和group by,因为子查询将包含两个表中的所有行


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

要计算哪一个?kd_hari列和显示计数到jml列取决于kd_hari列data@GoetzPantana-根据您想要的是4a表还是tbhari表,只需在其前面加上a或h即可。@GoetzPantana-不。这是Shadow的答案。以A或H作为前缀,如果有效,则将其答案标记为正确。@GoetzPantana由于您没有向我们显示样本数据,我们无法知道出现了什么问题,因此此答案看起来是正确的,并更新了包含前缀的答案。如果您认为它仍然不正确,那么请提供一些有意义的反馈,说明为什么这个答案不适合您,我可以对此作出反应。但是写下它不起作用将导致我放弃这个话题。@Shadow太好了,我接受你的回答。谢谢你的建议。