我正在尝试找出一种显示表中所有记录的方法,其中特定字段不包含某些值-表布局为:
id
tenant_id
request_action
request_id
request_status
hash
每个request_id可能有多个操作,因此看起来像这样:
1 1 email 1234 1 ffffd9b00cf893297ab737243c2b921c
2 1 email 1234 0 ffffd9b00cf893297ab737243c2b921c
3 1 email 1234 0 ffffd9b00cf893297ab737243c2b921c
4 1 email 1235 1 a50ee458c9878190c24cdf218c4ac904
5 1 email 1235 1 a50ee458c9878190c24cdf218c4ac904
6 1 email 1235 1 a50ee458c9878190c24cdf218c4ac904
7 1 email 1236 1 58c2869bc4cc38acc03038c7bef14023
8 1 email 1236 2 58c2869bc4cc38acc03038c7bef14023
9 1 email 1236 2 58c2869bc4cc38acc03038c7bef14023
Request_id可以是0(待定),1(发送)或2(失败)-我想找到所有哈希值,其中该哈希值内的所有request_status都设置为1。
在以上两个示例中,a50ee458c9878190c24cdf218c4ac904
应该作为匹配项返回,因为所有request_status均为1,但ffffd9b00cf893297ab737243c2b921c
不应为匹配项,虽然它包含1,但也包含0和{{1} }不应再包含1,但也应包含2
我尝试过:
58c2869bc4cc38acc03038c7bef14023
但是,这不能满足我的需要-仅在该哈希的所有实例的request_status设置为1的情况下,才能返回哈希值?
答案 0 :(得分:1)
不确定在这里为什么需要group by
。如果要使用group by
或其他聚合函数(GROUP_CONCAT
,sum
等)来合并数据,则需要执行max
此外,为什么不仅仅在获取所需状态的同时,还不应该在where子句(request_status !=0 and request_status !=2
中执行多个否定条件?
SELECT * FROM test WHERE request_action = 'email' AND request_status = 1
根据您的评论更新
如果您不想返回状态为0或2的任何哈希,则可以执行以下操作:
SELECT
*
FROM
test t
WHERE
request_action = 'email' AND request_status = 1
AND HASH NOT IN (SELECT HASH FROM test WHERE request_status IN (0, 2))
只需确保您在哈希表上有一个索引,否则这会非常慢。
答案 1 :(得分:0)
Create table temp select hash from your_table where
request_status=1 group by hash
Alter table temp add index(hash)
Delete from temp where hash IN (select hash from temp
where request_status!=1 group by hash)
Select * from your_table where hash IN(select hash from
temp)