MySQL НЕ В ВЫБРАТЬ - PullRequest
       3

MySQL НЕ В ВЫБРАТЬ

0 голосов
/ 09 июля 2020

У меня в проекте есть следующая таблица

+----+--------+-----------+-----------+
| id | old_id | op_status | tr_status |
+----+--------+-----------+-----------+
|  1 |        | issue     | Approved  |
|  2 |        | issue     | Approved  |
|  3 |        | issue     | Approved  |
|  4 |      1 | issue     | Issued    |
|  5 |      3 | issue     | Issued    |
+----+--------+-----------+-----------+

Я хочу выбрать записи WHERE tr_status = 'Approved' и NOT IN id в old_row_id. В этом примере нет необходимости выбирать идентификаторы 1 и 3, которые находятся в old_row_id, как следующий результат.

+----+--------+-----------+-----------+
| id | old_id | op_status | tr_status |
+----+--------+-----------+-----------+
|  2 |        | issue     | Approved  |
+----+--------+-----------+-----------+

Я использовал следующий запрос.

SELECT id, old_row_id, op_status, tr_status FROM table WHERE id NOT IN (old_row_id).

Но получается следующий результат.

+----+--------+-----------+-----------+
| id | old_id | op_status | tr_status |
+----+--------+-----------+-----------+
|  1 |        | issue     | Approved  |
|  2 |        | issue     | Approved  |
|  3 |        | issue     | Approved  |
+----+--------+-----------+-----------+

Что со мной может быть не так? кто-нибудь может мне помочь?

Ответы [ 4 ]

2 голосов
/ 09 июля 2020

Я бы сформулировал ваш запрос, используя exists logi c:

SELECT t1.id, t1.old_id, t1.op_status, t1.tr_status
FROM yourTable t1
WHERE
    t1.tr_status = 'Approved' AND
    NOT EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.old_id = t1.id);

screen capture from demo link below

Demo

1 голос
/ 09 июля 2020

Вы захотите оставить присоединить таблицу к самой себе по старому идентификатору, а затем удалить записи, где есть совпадения.

Например:

SELECT A.id, A.old_row_id, A.op_status, A.tr_status 
FROM table A
LEFT JOIN table B ON A.id = B.old_row_id
WHERE B.id IS NULL
AND A.tr_status = 'Approved';
1 голос
/ 09 июля 2020

Попробуйте сделать что-то вроде этого:

SELECT id, old_id, op_status, tr_status 
FROM table 
WHERE id NOT IN (SELECT DISTINCT old_id FROM table)
AND tr_status = 'Approved'
0 голосов
/ 09 июля 2020

Как вы пытались решить эту проблему, вы сопоставляете old_id со значением самой строки. Вы должны создать производную таблицу для создания декартового произведения:

SELECT id, old_id, op_status, tr_status 
FROM table 
WHERE id NOT IN (SELECT IFNULL(old_id, 0) FROM table)
AND tr_status = 'Approved'

Также IFNULL, чтобы также включить эту запись в подзапрос, иначе не может быть сравнен с null

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