【问题标题】:MySQL select to detect mutually exclusive row conflicts within groupsMySQL select检测组内互斥行冲突
【发布时间】:2015-08-05 18:19:22
【问题描述】:

使用以下示例数据,我想创建一个查询,该查询可以找到 item/desc 重复的位置,并且它们各自的数据字段不互斥。含义...对于给定的项目/描述组合,列中只能有 1 个数据值。

示例表记录:

id  | item  |  desc | data1 | data2 | data3
----+-------+-------+-------+-------+-------
1   |   1   | cat   |   a   |       |
2   |   1   | cat   |       |   b   |
3   |   1   | cat   |       |   e   |
4   |   2   | dog   |   a   |       |          
5   |   2   | dog   |       |   h   |   f
6   |   3   | apple |   k   |       |   m
7   |   3   | worm  |   a   |   g   |   x
8   |   4   | rock  |   p   |       |   s
9   |   4   | rock  |       |       |   s
10  |   4   | rock  |       |   t   |   z

预期的查询结果:

 item  |  desc 
-------+-------
   1   | cat                (because of conflict in data2 with b & e)
   4   | rock               (because of conflict in data3 with s,s & z

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    这应该有效:

    select distinct 
    item,
    `desc`
    from
    table
    group by item, `desc`
    HAVING count(distinct data1) > 1 or count(distinct data2) > 1 or count(distinct data3) > 1
    

    【讨论】:

    • desc 列可能需要反引号,因为它是保留字
    • 我理解答案,但不是被接受。 count()s 应该是 count(distinct)。
    • @Gordon 你去吧,所以它符合他的要求
    【解决方案2】:

    您可以进行简单的计数聚合和HAVING 子句来实现这一点。

    SELECT `item`,
       `desc`,
       COUNT(`data1`) AS `data1count`,
       COUNT(`data2`) AS `data2count`,
       COUNT(`data3`) AS `data3count`
    FROM table
    GROUP BY `item`, `desc`
    HAVING `data1count` > 1
       OR `data2count` > 1
       OR `data3count` > 1
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      相关资源
      最近更新 更多