Mysql中“相同”列的相关2个查询

iyr7buue  于 2022-12-17  发布在  Mysql
关注(0)|答案(2)|浏览(125)

我有一张如下表

report_code | result_of_report
_______________________________
Rpx-34512-00| rejected
Rpx-34512-01| rejected
Rpx-34512-02| rejected
Rpt-22433-00| rejected
Rpt-22433-01| rejected
Rpt-22433-02| rejected
Rpt-22433-03| rejected
Rpt-22433-04| rejected
Rpt-22433-05| rejected
Rpt-22433-06| accepted
Rcs-34555-00| rejected
Rcs-34555-01| rejected
Rcs-34555-02| accepted

而这正是我想得到的:对于report_code,我需要将substr(report_code, 4,5)转换为5位报告代码,并查找尚未接受的报告。
第6次修订(接受哪一个版本并不重要。)22433有一个接受的记录。所以它通过了。34555在第二个版本中被接受。它也通过了。但是34512没有任何接受的记录。我想列出所有像34512一样的记录,但是要分组。所以我不想列出很多重复的行。为了更清楚,不需要列出34512三次,一次就足够了。
首先我想解释一下我所做的尝试,我知道这不是正确的方法,但这对我来说是一个暂时的解决办法。
我运行了一个循环来获取where result_of_report='rejected',在这个循环中,我将5位数的report_code作为$code,并在第一个循环中使用这个代码作为where(report_code, 'like', '$code) AND where(result_of_report, '=', 'accepted')来查询每条记录。🤦‍♂️
正如你所看到的,这不是正确的方法,但我也不知道正确的方法。我愿意接受任何想法,使它在一个最有效的方式。不想使数百万循环迭代。感谢任何帮助提前。

62o28rlo

62o28rlo1#

可以按SUBSTR(report_code, 5,5)分组,并按如下方式使用条件聚集:

SELECT SUBSTR(report_code, 5,5) AS report_code
FROM table_name
GROUP BY SUBSTR(report_code, 5,5)
HAVING COUNT(CASE WHEN result_of_report='accepted' THEN 1 END) = 0

HAVING COUNT(CASE WHEN result_of_report='accepted' THEN 1 END) = 0用于确保至少有一行包含result_of_report='accepted'。请注意,count函数只计算空值,因此不计算包含result_of_report<>'accepted的行。
参见demo

cetgtptt

cetgtptt2#

我们可以在这里使用SUBSTRING_INDEX()沿着聚合:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(report_code, '-', 2), '-', -1) AS report_code
FROM yourTable
GROUP BY 1
HAVING SUM(result_of_report = 'accepted') = 0;

相关问题