Ниже представлена структура таблицы.
user_id quote_id bill_type(2=>proforma,1=>invoice)
474 676 2
674 676 2
474 676 1
445 680 2
422 120 2
411 240 2
411 240 2
410 240 2
410 240 1
В основном на моем портале у нас есть Покупатель и Продавец (user_id), и оба они могут покупать и продавать с определенным quote_id, как показано в приведенной выше таблице. У определенной пары покупателей и продавцов может быть несколько quote_id. (вы можете рассмотреть случай Amazon, где конкретный покупатель может приобрести несколько продуктов у конкретного продавца. Здесь будет quote_id)
Здесь bill_type ссылается на счет-фактуру (1) или проформа (2). Счет будет отправлен пользователю только один раз, и проформа может быть отправлена несколько раз для определенного quote_id. Теперь проблема заключается в том, что я хочу вернуть данные, чтобы пользователи, чей счет еще не был создан для определенного quote_id, должны быть возвращены.
Если мы рассмотрим вышеприведенный случай, то возвращаемые данные должны быть:
user_id quote_id bill_type(2=>proforma,1=>invoice)
674 676 2
445 680 2
422 120 2
411 240 2
Это пользователи, чей вексель еще не создан для конкретной quote_id.
Запрос, который мне удалось сделать до сих пор:
select *, GROUP_CONCAT(bill_type) as bt,GROUP_CONCAT(user_id)
from quote
GROUP BY quote_id
Теперь я удаляю пользователя, чей счет создается с помощью программы. но это неправильный способ сделать. Мне нужен запрос для достижения этого.
Вы можете сделать это с предложением WHERE NOT EXISTS
, чтобы проверить, нет ли соответствующего счета-фактуры, отправленного для конкретной user_id/quote_id
:
SELECT DISTINCT q1.user_id, q1.quote_id, q1.bill_type
FROM quote q1
WHERE NOT EXISTS (SELECT *
FROM quote q2
WHERE q2.user_id = q1.user_id AND q2.quote_id = q2.quote_id AND q2.bill_type = 1)
Выход:
user_id quote_id bill_type
674 676 2
445 680 2
422 120 2
411 240 2
DISTINCT
на SELECT
гарантирует, что вы не получите несколько строк в ситуациях, когда отправляется более одного счета-проформы (например, комбинация 411/240).
Чтобы иметь дело с случаем, когда quote_id NULL, и вы не хотите, чтобы эти строки выводились, измените запрос на:
SELECT DISTINCT q1.user_id, q1.quote_id, q1.bill_type
FROM quote q1
WHERE NOT EXISTS (SELECT *
FROM quote q2
WHERE q2.user_id = q1.user_id AND q2.quote_id = q2.quote_id AND q2.bill_type = 1)
AND q1.quote_id IS NOT NULL
quote_id
. Я предполагал, что вы не отправите счет, если нет предложения, если это не так, дайте мне знать.
Попробуйте этот запрос:
select distinct
t1.user_id,
t1.quote_id,
t1.bill_type
from
quote t1
left join quote t2 on t1.user_id = t2.user_id and
t1.user_id = t2.user_id and
t2.bill_type = 1
where
t1.bill_type = 2 and
t2.bill_type is null;
Демо на SQL Fiddle