在mysql中,如何仅选择一列中具有相同值但在另一列中具有不同值的每一行?

时间:2013-04-17 00:52:54

标签: mysql

我不是一个真正的后端开发人员,所以我对sql的经验很少。我需要从表格中过滤“月度购买”,客户会在同一交易产品中购买,以便在不同日期发货。

假设我把它放在桌子上:

transactionID |   deliveryDate  
------------- |   ------------
  1           |    2013-11-24  
  1           |    2013-11-24  
  2           |    2013-11-26   
  3           |    2013-11-10  
  3           |    2013-11-17  
  3           |    2013-11-24  
  4           |    2013-11-10  
  4           |    2013-11-10  
  4           |    2013-11-17  
  4           |    2013-11-17

我希望这样做:

transactionID |   deliveryDate  
------------- |   ------------
  3           |    2013-11-20  
  3           |    2013-11-22  
  3           |    2013-11-24  
  4           |    2013-11-10  
  4           |    2013-11-10  
  4           |    2013-11-17  
  4           |    2013-11-17

交易3和4是唯一符合我标准的交易,因为交易1,而在同一交易中有多次买入,交割日期是相同的。交易2不适合我需要购买多件商品。 所以,基本上我需要选择transactionID的计数多于一行的每一行,但只有那里还有多个不同的deliveryDate。

到目前为止我尝试的是:

SELECT *
FROM myTable
WHERE `transactionID` IN
    (     SELECT `transactionID`
          FROM `myTable`
          GROUP BY `transactionID`
          HAVING COUNT(*) > 1
    )
ORDER BY `transactionID`

我知道我只是在同一笔交易中有多个买入时进行过滤,但我真的不知道该怎么做。此外,由于有很多列,这个查询非常慢,所以我认为可能有一个更好的方向,有些人可以指点我。

谢谢!

3 个答案:

答案 0 :(得分:3)

你很亲密。您需要计算不同的日期:

SELECT *
FROM myTable
WHERE `transactionID` IN
    (     SELECT `transactionID`
          FROM `myTable`
          GROUP BY `transactionID`
          HAVING COUNT(distinct DeliveryDate) > 1
    )
ORDER BY `transactionID`

答案 1 :(得分:1)

我想这会更快,它也会删除重复的行(具有相同ID和日期的行)

SELECT 
   a.transactionID,
   a.deliveryDate,
count( b.transactionID )
FROM 
    temp a
    JOIN temp b ON ( a.transactionID = b.transactionID AND a.deliveryDate <> b.deliveryDate )
GROUP BY
   a.transactionID,
   a.deliveryDate
HAVING
   count( b.transactionID ) > 1

答案 2 :(得分:0)

使用它也可以。

SELECT *
    FROM myTable GROUP BY `transactionID`HAVING COUNT(DeliveryDate) > 1 ORDER BY `transactionID`