在此处提出可能以某种形式或其他形式回答的问题的道歉,但我无法让这些解决方案适用于我。
我有以下查询:
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 BY
和HAVING
的尝试不起作用,因为我检查了所有三个日期字段都为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"第五排房间分配时的价值,由于某种原因没有发生。
答案 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%不符,那么道歉,但它确实为我解决了问题。