【发布时间】:2016-12-30 10:31:15
【问题描述】:
我正在尝试执行以下操作,但我还无法做到:(。
我有这些表:
table1 -> tb1_id, tb1_name
Sample Data:
--------------
1 group1
2 group2
3 group3
4 group4
5 group5
table2 -> tb2_id, tb2_sector, tb2_tb3_id
Sample Data:
--------------
1 alpha 1
2 beta 2
3 gamma 2
4 delta 2
5 epsilon 4
table3 -> tb3_id, tb3_mid, tb3_section
Sample Data:
--------------
1 234 alpha,beta,gama,delta
这是我正在寻找的输出:
Name Count %
------ ----- -----
group1 1 25%
group2 3 75%
group3 0 0%
group4 0 0%
group5 0 0%
基本上我需要拆分一个由逗号分隔的列值(table3 中的 tb3_section),然后为每个值找到正确的组(table2 给了我与 table1 链接的组 id),然后按组进行总计数和获取百分比(假设总数为 100%)。
这是我目前尝试过的查询:
我搜索了拆分值样本,并找到了一个通过首先创建数字表进行拆分的样本:
create table numbers (
`n` INT(11) SIGNED
, PRIMARY KEY(`n`)
)
INSERT INTO numbers(n) SELECT @row := @row + 1 FROM
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t2,
(SELECT 0 UNION ALL SELECT 1) t8,
(SELECT @row:=0) ti;
后来,我这样做了:
select tb3_section, count(1) from (
select
tb3_mid,
substring_index(
substring_index(tb3_section, ',', n),
',',
-1
) as tb3_section from table3
join numbers
on char_length(tb3_section)
- char_length(replace(tb3_section, ',', ''))
>= n - 1
) tb3_section_dashboard
group by 1
这并没有给我组数。只是拆分 tb3_section 但没有给我正确的计数和等效百分比。任何想法都会非常感谢它。
最新更新
首先,我要感谢@eggyal 为我指出了正确的方向,感谢@Shadow 鄙视知道我没有采取最好的方法,他想出了一个快速解决我的问题的方法。我设法改变了方法并从 table3 中删除了逗号分隔的值。相反,现在我为每个新值添加多行(并添加了一个约束以避免重复)。
现在 table3 看起来像:
Sample Data:
--------------
1 234 alpha
2 234 beta
3 234 gama
4 234 delta
5 235 alpha
这是我从@shadow 示例中获取的查询:
SELECT t1.tb1_name, COUNT(t3.tb3_section) AS no_per_group,
COUNT(t3.tb3_section) / t4.no_of_groups AS percentage
FROM t1 left
JOIN t2 ON t1.tb1_id=t2.tb2_tb3_id
INNER JOIN t3 ON t2.tb2_sector=t3.tb3_section>0
JOIN (SELECT COUNT(*) AS no_of_groups
FROM t3 INNER JOIN t2 ON t2.tb2_sector=t3.tb3_section>0) t4
GROUP BY t1.tb1_name
现在我使用 = 来匹配确切的值,而不是使用 find_in_set。 现在我得到类似以下的结果,但百分比看起来很奇怪,我错过了一个没有匹配的组:
Name no_per_group percentage
----- ------------- ----------
group1 2 0.1053
group3 3 0.1579
group4 3 0.1579
group5 3 0.1579
虽然我仍然需要类似的东西:
Name Count %
------ ----- -----
group1 1 25%
group2 3 75%
group3 0 0%
group4 0 0%
group5 0 0%
请注意,如果组中没有匹配项,我仍然需要显示该组。 因为我有数千条彼此不同的记录,所以我需要添加另一个条件:where tb3_mid=234。喜欢这个,结果是用到tb3_mid。
【问题讨论】:
-
非常感谢@eggyal 指出比尔的好答案。就我而言,问题是我没有完全控制实际的表,因为我没有创建它们:(。但是,我现在可以体验在一列中存储分隔值的问题。
-
你可以从 MySQL 的
FIND_IN_SET()函数构造一个连接谓词。
标签: c# mysql stored-procedures