Mysql 使用Group By连接2个表
Mysql 使用Group By连接2个表,mysql,sql,join,group-by,Mysql,Sql,Join,Group By,poll\u opts用于存储选项的表格和poll\u-voted用于存储投票结果,pid表示投票id(唯一),oid表示选项id(仅适用于单个投票) poll\u voted[主键:pid.oid.emp] +-----+-----+-------+ | pid | oid | emp | +-----+-----+-------+ poll\u opts[主键:pid.oid] +-----+-----+---------+ | pid | oid | opt | +-----
poll\u opts
用于存储选项的表格和poll\u-voted
用于存储投票结果,pid表示投票id(唯一),oid表示选项id(仅适用于单个投票)
poll\u voted
[主键:pid.oid.emp]
+-----+-----+-------+
| pid | oid | emp |
+-----+-----+-------+
poll\u opts
[主键:pid.oid]
+-----+-----+---------+
| pid | oid | opt |
+-----+-----+---------+
pid&oid类型:int
,opt
类型:text
如果您还需要“不存在”结果,则需要一个左外部联接
保留轮询选项
中的所有结果,即使在轮询投票
中未找到匹配项
查询:
select opt, count(vo.oid)
from poll_opts po
left outer join poll_voted vo on vo.oid = po.oid and po.pid=vo.pid
where po.pid = 3 -- 3
group by opt
输出:
opt count(vo.oid)
Chrome 0
Firefox 0
IE 0
MS Edge 0
Opera 1
测试数据:
CREATE TABLE poll_voted (`pid` int, `oid` int, `emp` int);
INSERT INTO poll_voted (`pid`, `oid`, `emp`)
VALUES
(1, 0, 1989),
(1, 2, 1989),
(1, 4, 1989),
(1, 6, 1989),
(3, 2, 1989)
;
CREATE TABLE poll_opts (`pid` int, `oid` int, `opt` varchar(15));
INSERT INTO poll_opts (`pid`, `oid`, `opt`)
VALUES
(1, 0, 'WinXP'),
(1, 2, 'wIN7'),
(1, 4, 'wIN 10'),
(1, 6, 'Ubuntu'),
(3, 0, 'IE'),
(3, 1, 'MS Edge'),
(3, 2, 'Opera'),
(3, 3, 'Chrome'),
(3, 4, 'Firefox')
;
不要在where子句中联接表,请使用正确的联接语法。哪把钥匙?用于将投票与投票关联起来_opts@PatrickArtner可以使用pid。pid代表轮询id(唯一),oid代表选项id(仅限每次轮询)。您在寻找什么?戈登·林诺夫给了你一份声明。如果它有“错误”的输出,可能是您没有说您的预期输出是什么?您的
poll\u-voted
不包含poll1的任何oid条目,因此在加入时不会考虑所有条目,除非您使用某种对数据没有多大意义的左加入。此外,分组也没有多大意义,因为每个组只包含一个元素,所以分组对您没有任何帮助…@PatrickArtner我已经添加了详细信息。希望这有助于解决问题。