如何使用group by进行mysql查询

时间:2018-08-02 12:18:10

标签: mysql sql group-by

下面是我拥有的表结构

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 。 (您可以考虑在亚马逊的情况下,特定买方可以从特定卖方购买多种产品。此处的产品为 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

现在,我要删除其发票是在程序帮助下生成的用户。但这不是正确的方法,我需要通过查询来实现。

2 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分: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上的演示