Как сделать запрос MySQL, используя группу по

0

Ниже представлена структура таблицы.

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

Теперь я удаляю пользователя, чей счет создается с помощью программы. но это неправильный способ сделать. Мне нужен запрос для достижения этого.

  • 0
    удалить "*," изменить выбор из запроса
  • 0
    @areklipno да, но все равно я не смогу получить желаемый результат
Теги:
group-by

2 ответа

2
Лучший ответ

Вы можете сделать это с предложением 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

SQLFiddle

  • 0
    Я попытался выполнить вышеизложенное в моем наборе данных, в этих строках также будет указано quote_id как ноль. в моем наборе данных есть некоторые нулевые значения. как я могу ограничить их
  • 0
    @NikhilGupta Я обновил свой запрос и SQLFiddle для работы со значениями NULL в quote_id . Я предполагал, что вы не отправите счет, если нет предложения, если это не так, дайте мне знать.
0

Попробуйте этот запрос:

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

  • 0
    Я не могу понять, почему вы сделали t2.bill_type имеет значение null
  • 0
    При этом мы исключаем строки с bill_type = 2, у которых есть соответствующая строка с bill_type = 1. Я надеюсь, что это проливает свет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню