下面是我的桌子结构

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

基本上,在我的门户中,我们有买家和卖家(用户id),他们都可以用上表所示的特定报价id进行买卖。一对特定的买家和卖家可以有多个报价id(您可以考虑亚马逊的情况,其中特定的买家可以从特定的卖家购买多个产品)。产品将在此处报价
这里bill_type指的是发票(1)或形式发票(2)。发票只会发送给用户一次,对于一个特定的报价id,可以多次发送形式发票。现在的问题是,我想返回数据,以便返回尚未为特定报价id生成发票的用户。
如果我们考虑上述情况,那么返回的数据应该是:
user_id    quote_id    bill_type(2=>proforma,1=>invoice)
    674        676          2
    445        680          2
    422        120          2
    411        240          2

这是尚未为特定报价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\u 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)
    AND q1.quote_id IS NOT NULL

SQLFiddle

关于mysql - 如何使用group by进行mysql查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51653481/

10-09 00:51
查看更多