按组显示字段的所有实例中都存在值的记录

时间:2018-06-25 20:46:15

标签: mysql group-by

我正在尝试找出一种显示表中所有记录的方法,其中特定字段不包含某些值-表布局为:

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的情况下,才能返回哈希值?

2 个答案:

答案 0 :(得分:1)

不确定在这里为什么需要group by。如果要使用group by或其他聚合函数(GROUP_CONCATsum等)来合并数据,则需要执行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)