0

我正在尝试实现一个 SQL 查询,它连接多行并返回相等值的出现次数。

ID    Row_1    Row_2    Row_3
1     Value    NULL     NULL
2     NULL     Value    Value
3     NULL     Value    NULL
4     NULL     Value2   NULL

查询应返回两行

ID    Row     Count
1*    Value   3
4     Value2  1

第一个返回行的 ID 无关紧要。如果 value 在所有三个原始行中都是唯一的,则应返回原始 ID(如结果集的第 2 行所示)。我不得不提一下,表中有超过 50.000 行。它不应该花费太多时间。

我尝试了几种方法,例如将表格与自身连接起来。没有什么能真正解决问题。

提前致谢。

马可

4

2 回答 2

2

首先,您可以创建一个组合所有非空值列表的子查询,然后加入该列表。

值列表的子查询:

SELECT row_1 AS val FROM mytable WHERE row_1 IS NOT NULL
UNION
SELECT row_2 AS val FROM mytable WHERE row_2 IS NOT NULL
UNION
SELECT row_3 AS val FROM mytable WHERE row_3 IS NOT NULL

UNION隐式执行 a DISTINCT,因此结果列表不会有重复值。)

然后我们可以加入它来获得我们的计数:

SELECT m.id, v.val AS `row`, COUNT(*) AS `count`
FROM mytable m
INNER JOIN (
  SELECT row_1 AS val FROM mytable WHERE row_1 IS NOT NULL
  UNION
  SELECT row_2 AS val FROM mytable WHERE row_2 IS NOT NULL
  UNION
  SELECT row_3 AS val FROM mytable WHERE row_3 IS NOT NULL
) v
  ON v.val = m.row_1
    OR v.val = m.row_2
    OR v.val = m.row_3
GROUP BY v.val

这是一个关于 SQL Fiddle 的工作示例

于 2012-07-12T17:14:27.683 回答
0

我们可以这样做::

Select 
ID, 
CONCAT(ifnull(ROW_1,''), ifnull(ROW_2,''), ifnull(ROW_3,'')) as `temp_ROW`,
count(1) as count

from table group by temp_ROW;
于 2012-07-12T15:40:26.537 回答