Показать записи, в которых значение существует во всех экземплярах поля по группам - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь найти способ показать все записи в таблице, где определенное поле не содержит определенных значений - макет таблицы:

id
tenant_id
request_action
request_id
request_status
hash

Каждый идентификатор запроса может иметь несколько действий, чтобы он мог выглядетьнапример:

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, а 58c2869bc4cc38acc03038c7bef14023 не должен как,опять же, хотя он содержит 1, он также содержит некоторые 2

Я пытался:

SELECT 
   * 
from 
  table 
where request_action='email' and request_status!=0 and request_status!=2 
group by hash

Однако, это не дает мне нужный мне результат - как я могу вернуть только хэшигде request_status установлен в 1 для всех экземпляров этого хэша?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018
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)
0 голосов
/ 26 июня 2018

Не уверен, зачем вам нужен 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))

Просто убедитесь, что у вас есть индекс для хэша, иначе это будет очень медленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...