2017-01-20 9 views
-1

У меня есть следующие две таблицы и столбцыMysql запрос NOT EXISTS не работает должным образом

Таблица 1: TransactionID

Таблица 2: TransactionID и статус

Мне нужно, чтобы получить результаты из таблицы 1, если же TransactionID не существует в table2

Если же TransactionID в table2 существует, но состояние отличается от 2, то она не должна возвращать TABLE1 Row

Если же TransactionID в table2 существует и статус 2, то он должен вернуть таблицу 1 строку, но мне нужно знать об этом, так что я могу показать ошибку в моем сайте

я в настоящее время:

select * from table1 where not exists (select null from table2 
      WHERE table1.transactionid = table2.transactionid AND status <> 2) 

мне нужно было что-то вроде этого (он не работает должным образом)

select *, (select count(*) from table2 where table1.transactionid = table2.transactionid AND status = 2) as orderswitherrors from table1 where not exists (select null from table2 
      WHERE table1.transactionid = table2.transactionid AND status <> 2) 

Таким образом, в PHP я могу проверить, если что TransactionID имеет ошибку в table2 с, если ($ row-> orderswitherrors> 0) .. .

Спасибо

ответ

1

Я думаю, вы слишком беспокоитесь, пытаясь использовать СУЩЕСТВУЮЩИЕ.

В этом запросе мы просто используем соединение, чтобы получить как таблицу1, так и таблицу2 в наборе результатов. Мы используем левое соединение, так что строки из таблицы 1 будут возвращены, даже если они не существуют в таблице2. Если не существует соответствующей строки, то в наборе результатов будет отображаться NULL для всех столбцов Table2.

Как только у нас есть набор результатов, в котором есть обе таблицы, мы просто фильтруем эти строки так, чтобы мы сохраняли только строки, где: a) нет строки из таблицы2 или (b) есть строка и статус = 2.

SELECT table1.*, 
      table2.status 
FROM  table1 
LEFT JOIN table2 ON table1.transactionid = table2.transactionid 
WHERE  table2.transactionid IS NULL --Doesn't exist in table2 
OR  table2.status = 2    --Exists in table2 with status 2 
+0

Могу ли я просить вас, пожалуйста, добавить еще некоторый контекст вокруг вашего ответа. Кодовые ответы трудно понять. Это поможет читателю и будущим читателям, если вы сможете добавить дополнительную информацию в свой пост. – RBT

+0

http://imgur.com/a/dojSZ Спасибо за помощь, однако мне не нужно возвращать какие-либо результаты, если в одной из строк таблицы 2 есть статус 1. благодаря – lorigio

2

Вы можете использовать «левый присоединиться» вместе с case заявления, чтобы получить идентификатор транзакции с государством, и ошибка показать/скрыть на основе состояния, например:

SELECT t1.transactionid, 
CASE WHEN t2.status IS NULL THEN 'NOT_EXISTS' 
WHEN t2.status = 2 THEN 'ERROR' 
END AS state 
FROM table1 t1 LEFT JOIN table2 t2 ON t1.transactionid = t2.transactionid 
WHERE t2.status IS NULL OR t2.status = 2 
ORDER BY t1.transactionid; 

Вот SQL Fiddle.

0

Вы можете использовать NOT EXISTS и EXISTS в комбинации:

select t1.* 
from table1 t1 
where not exists (select 1 
        from table2 t2 
        where t1.transactionid = t2.transactionid 
       ) or 
     exists (select 1 
       from table2 t2 
       where t1.transactionid = t2.transactionid and 
        status = 2 
      );