SQL查询以获取用户不同意

时间:2019-07-17 12:12:30

标签: mysql sql

我有一些针对不同情况的分析数据。每个案例都与一张或多张照片相关联。每张照片由两个用户分析。 存储的数据看起来像 Source data

我想要的是让SQL查询生成不一致结果,如下所示

其他 dis-agreement list-1

dis-agreement list-2

有人可以帮助我实现这一目标吗?

感谢您分享宝贵的时间。

这是要用于测试的示例数据

Case Id,Photo Id,FeatureCheck,Result,CheckedBy 
17116,173442,severity,none,24 
17116,173442,severity,low,25 
17116,175062,severity,none,26 
17116,175062,severity,none,27 
17116,175427,severity,medium,24 
17116,175427,severity,high,28 
17116,175748,severity,low,22 
17116,175748,severity,none,30 
17116,176031,severity,low,24 
17116,176031,severity,low,29 
17277,175309,severity,none,24 
17277,175309,severity,none,25 
17277,175649,severity,none,24 
17277,175649,severity,none,25

4 个答案:

答案 0 :(得分:1)

您可以使用INNER JOIN

SELECT
 t1.`Case Id`,  t1.`Photo Id`,t1.FeatureCheck,t1.CheckedBy,t1.Result,t2.CheckedBy,t2.Result
FROM test t1
 JOIN test t2
ON (t1.`Case Id`=t2.`Case Id` 
    AND  t1.`Photo Id`= t2.`Photo Id` 
    AND t1.CheckedBy!=t2.CheckedBy 
    AND t1.CheckedBy<t2.CheckedBy)
WHERE t1.Result!=t2.Result;

DEMO

答案 1 :(得分:1)

方法

建议的解决方案的关键是,对于案例,照片和功能的每种组合,您总是会有2条评论。

按所述组合进行分组,您将得到大小为2的分组。因此,通过将MIN / MAX应用于result / {{1 }}。

您现在需要检查的是,用户ID的最小值和结果的最小值是否属于同一组记录。如果是这样,则说明您已完成,否则必须交换用户ID或结果。等效于交换,您必须为checkedby字段应用MAX而不是MIN,反之亦然。

可以通过根据用户ID和查看结果计算组内的等级并检查它们是否与给定记录匹配来执行检查。请注意,在任何给定组中,匹配谓词的结果都是恒定的。因此,我们可以将此谓词添加到分组条件中。

查询1(需要Mysql 8)

result

SELECT caseid , photoid , featurecheck , MIN(checkedby) user1 , CASE reversal WHEN 0 THEN MIN(result) ELSE MAX(result) END review1 , MAX(checkedby) user2 , CASE reversal WHEN 0 THEN MAX(result) ELSE MIN(result) END review2 FROM ( SELECT t.* , CASE WHEN RANK() OVER (PARTITION BY caseid, photoid, featurecheck ORDER BY result) = RANK() OVER (PARTITION BY caseid, photoid, featurecheck ORDER BY checkedby) THEN 0 ELSE 1 END reversal FROM test t ) tbase GROUP BY caseid , photoid , featurecheck , reversal HAVING MIN(result) <> MAX(result) ; 拥有 Approach 部分中提到的前提,having子句选择那些评论不匹配的情况。

Here是数据库提琴。

查询2

可以模拟使用早期MySQL版本中缺少的reversal函数。

RANK

Here是数据库提琴。

答案 2 :(得分:0)

HAVING子句可以为您显示结果。

SELECT  caseid, photo_id , feature_check, agreedupon
FROM table1
GROUP BY caseid,  photo_id, feature_check, agreedupon
HAVING count(agreedupon) = 1

答案 3 :(得分:0)

我将使用子查询来获取case_id和photo_id,但结果不同:

SELECT
    p.case_id,
    p.photo_id,
    p.feature_check,
    p.result,
    p.checked_by
FROM photos p
INNER JOIN (
    SELECT
        case_id,
        photo_id,
        count(distinct result)
    FROM
        photos
    GROUP BY
        case_id,
        photo_id
    HAVING
        count(distinct result) > 1
) sub ON p.case_id = sub.case_id AND p.photo_id = sub.photo_id
;