【问题标题】:mySQL - Group 2 rows based on different columnsmySQL - 根据不同的列对 2 行进行分组
【发布时间】:2014-06-21 01:36:28
【问题描述】:

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

这是表格的样子:

| 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 个查询),因为我觉得它是记录太简单了。

【问题讨论】:

  • 我们可以建议标准化吗?

标签: mysql sql


【解决方案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;

【讨论】:

  • 如何使用我的 IS_SAME() 函数进行比较,而不是进行假设 100% 相似性的组?
  • @Nikzilla 。 . .这就是这个查询的作用。
  • 哦。那么在这种情况下,我会测试它!累了就别写代码了!
  • 如果group by names.name 可能由于与is_same(..) = true 的名称不同而导致重复行。可能需要对结果进行重复数据删除。
  • @Fabricator 。 . .您的问题似乎没有此类重复的示例。在任何情况下,group by 都会删除重复项并选择其中一个值。您可以使用group_concat() 获取列中的所有值。
猜你喜欢
  • 2015-08-08
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2020-08-05
  • 2019-02-12
  • 2013-02-16
相关资源
最近更新 更多