我在 MYSQL 查询中遇到问题。
我有三个表,第一个是凭证表其他客户,第三个是凭证表客户端。
在oucher_client 表中,我有与凭证表相关的凭证id
列,我想计算客户端表中的相关行。
例如,如果优惠券表的 id
为 2 并且优惠券客户为 2,则查询将从客户表 age_group
列中进行检查,其中 age_group
是成人、 child 或婴儿
这里有一些表格图片以了解更多详细信息。
请帮帮我
凭证表
客户表
优惠券客户表
我正在尝试这样做
SELECT `v`.*, `a`.`name` as `agent_name`, COUNT(CASE WHEN c.age_group = 'Adult' THEN c.id END) AS t_adult, COUNT(CASE WHEN c.age_group = 'Child' THEN c.id END) AS t_child, COUNT(CASE WHEN c.age_group = 'Infant' THEN c.id END) AS t_infant, COUNT(c.id) as total FROM `voucher` `v` JOIN `voucher_client` `vc` ON `vc`.`voucher_id`=`v`.`id` JOIN `client` `c` ON `vc`.`client_id`=`c`.`id` JOIN `tbl_users` `a` ON `a`.`userId`=`v`.`agent_id` LEFT JOIN `voucher_hotel` `vh` ON `vh`.`voucher_id`=`v`.`id` WHERE `v`.`isDeleted` =0 GROUP BY `v`.`id` ORDER BY `v`.`id` DESC
预期输出如下
voucher_id t_adult t_child t_infant
1 2 0 0
2 1 0 0
最佳答案
如果只想在结果中显示v.id
,则在查询中将v.*
替换为v.id
。
(顺便说一句,当存在分组依据时,大多数数据库甚至不允许使用 *
。MySql 在这方面偏离了 ANSI SQL 标准。)
如果您需要加入具有 1-N 关系的额外表?然后您可以计算不同的值。这样总数仅反射(reflect)唯一的 clientid。
SELECT
v.id AS voucher_id,
COUNT(DISTINCT CASE WHEN c.age_group = 'Adult' THEN c.id END) AS t_adult,
COUNT(DISTINCT CASE WHEN c.age_group = 'Child' THEN c.id END) AS t_child,
COUNT(DISTINCT CASE WHEN c.age_group = 'Infant' THEN c.id END) AS t_infant
-- , COUNT(*) as total
-- , COUNT(c.id) as total_clientid -- count on value doesn't count NULL's
-- , COUNT(DISTINCT c.id) as total_unique_clientid
FROM voucher v
JOIN voucher_client vc ON vc.voucher_id = v.id
JOIN client c ON c.id = vc.client_id
-- LEFT JOIN voucher_hotel vh ON vh.voucher_id = v.id
WHERE v.isDeleted = 0
-- AND c.age_group = 'Adult' -- uncomment this to only count the adults
GROUP BY v.id
ORDER BY v.id
关于mysql查询计算连接三个表的行数并计算一个表的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51379290/