mySQL - 基于不同列的第2组行

时间:2014-06-21 01:36:28

标签: mysql sql

我正在尝试根据其他列对行进行分组。

这就是表格的样子:

| a_id | a_name | b_id | b_name | c_id | c_name | d_id | d_name |
|------|--------|------|--------|------|--------|------|--------|
|   1  | abcdef |   0  |        |   0  |        |   0  |        |
|   2  |   zxy  |   0  |        |   0  |        |   0  |        |
|   3  |  lmao  |   0  |        |   0  |        |   0  |        |
|   0  |        |   1  |   oop  |   0  |        |   0  |        |
|   0  |        |   2  | abcdef |   0  |        |   0  |        |
|   0  |        |   0  |        |   1  |  nope  |   0  |        |
|   0  |        |   0  |        |   2  | nothing|   0  |        |
|   0  |        |   0  |        |   0  |        |   1  | abcdef |
|   0  |        |   0  |        |   0  |        |   2  |  oop   |
|   0  |        |   0  |        |   0  |        |   3  | turtles|

我希望将所有相似的名称组合成一行。相似性由用户定义的函数IS_SAME(str1,str2)确定。

这就是结果应该是什么样的。

| a_id | a_name | b_id | b_name | c_id | c_name | d_id | d_name |
|------|--------|------|--------|------|--------|------|--------|
|   1  | abcdef |   2  | abcdef |   0  |        |   1  | abcdef |
|   2  |   zxy  |   0  |        |   0  |        |   0  |        |
|   3  |  lmao  |   0  |        |   0  |        |   0  |        |
|   0  |        |   1  |   oop  |   0  |        |   2  |  oop   |
|   0  |        |   0  |        |   1  |  nope  |   0  |        |
|   0  |        |   0  |        |   2  | nothing|   0  |        |
|   0  |        |   0  |        |   0  |        |   3  | turtles|

我实际上已经创建了一个查询来执行此操作,但我在其上执行了所有Fermat的最后定理并且没有保存我使用的查询(我保存了之前用于维护此列表的前5个查询)因为我觉得它是记录太简单了。

1 个答案:

答案 0 :(得分:1)

这很复杂但可行。您希望从名称列表开始,然后加入每个表并聚合在第一列:

select max(ta.a_id) as a_id, max(ta.a_name) as a_name,
       max(tb.b_id) as a_id, max(tb.b_name) as b_name,
       max(tc.c_id) as a_id, max(tc.c_name) as c_name,
       max(td.d_id) as a_id, max(td.d_name) as d_name       
from (select a_name as name from table t union select b_name union select c_name union select d_name
     ) names left outer join
     table ta
     on is_same(ta.a_name, names.name) left outer join
     table tb
     on is_same(tb.b_name, names.name) left outer join
     table tc
     on is_same(tc.c_name, names.name) left outer join
     table td
     on is_same(td.d_name, names.name)
group by names.name;