识别MySQL表中的错误数据

时间:2018-03-20 13:25:04

标签: mysql left-join inner-join

在此处提出可能以某种形式或其他形式回答的问题的道歉,但我无法让这些解决方案适用于我。

我有以下查询:

SELECT `user_id`, `application_id`, `unallocated_date`, `check_in_date`, `check_out_date` 
FROM `student_room` 
WHERE `user_id` = 17225
ORDER BY `application_id` DESC

它产生以下结果:

user_id | application_id | unallocated_date    | check_in_date       | check_out_date   
--------+----------------+---------------------+---------------------+---------------
17225   | 30782          | 2018-02-04 14:32:29 | NULL                | NULL
17225   | 30782          | 2018-02-04 14:32:49 | NULL                | NULL
17225   | 30782          | 2018-02-04 14:32:51 | NULL                | NULL
17225   | 30782          | NULL                | NULL                | NULL
17225   | 30782          | NULL                | 2018-02-04 14:41:54 | NULL

结果中的第四行是我的数据中的错误;它应该看起来类似于前三行 - 这些行发生在学生被分配一个新房间时,前一个需要未分配。在这种情况下,由于我正在处理的系统中的历史错误或用户错误,第4行的未分配实际上并未发生,但很可能是前者。

如何识别所有这些行?我对GROUP BYHAVING的尝试不起作用,因为我检查了所有三个日期字段都为NULL的位置,但它没有找到这个特定的用户 - 所以我做错了。我的原始查询是:

SELECT COUNT(user_id) AS `count`, user_id FROM `student_room`
WHERE `unallocated_date` IS NULL
AND `check_in_date` IS NULL
AND `check_out_date` IS NULL
GROUP BY `user_id`
HAVING COUNT(user_id) > 1
ORDER BY `user_id` ASC

我也试过了各种INNER JOIN次尝试,但我没有正确地尝试过......

我感兴趣的行将至少有一个条目,其中所有三个日期都为NULL,但也有一个条目,其中check_in_date为NOT NULL,如本示例所示。如果我只有前四行,那么数据可能是正确的,但第五行的存在使得第四行成为错误的记录 - 它应该被给予" unallocated_date"第五排房间分配时的价值,由于某种原因没有发生。

1 个答案:

答案 0 :(得分:0)

与我的一位朋友一起,我们提出了以下有效的查询。我现在知道你可以在MySQL中使用“EXISTS”。我看到它在删除或创建表时使用,但从不喜欢这样。最后,这个查询解决了这个问题:

SELECT cte.user_id, COUNT(*)
FROM (
    SELECT sro.user_id
    FROM student_room AS sro
    WHERE sro.unallocated_date IS NULL
    AND sro.check_in_date IS NULL
    AND sro.check_out_date IS NULL
    AND EXISTS ( 
        SELECT *
        FROM student_room AS sri
        WHERE sri.user_id = sro.user_id
        AND sri.student_room_id > sro.student_room_id
    )
    ORDER BY user_id DESC
)
AS cte
GROUP BY cte.user_ID
ORDER BY COUNT(*) DESC

这个查询是一个多小时修补错误记录的结果,所以如果这似乎与问题的要求100%不符,那么道歉,但它确实为我解决了问题。