Mysql select min 在一组行中,其中 userid=?

Mysql select min in group of rows where userid=?

此 table 存储有关谁在何时购买了哪本书的数据。我想知道 USERID #1 首先购买了哪些书。 SQL fiddle

这会导致

USERID  BOOKID  DATE_PURCHASE
1       2       2014-03-22 (purchased only by USERID #1)
1       5       2014-03-29 (purchased earlier than USERID #2)
1       6       2014-03-28 (purchased earlier than USERID #3)
1       7       2014-03-26 (purchased earlier than USERID #3)

它没有显示 BOOKID #3,因为这本书是由 USERID #2 首先购买的。

请注意 table 可能包含数万行,因此我需要一个有效的解决方案。

如果必须手动执行,我会这样做:

1. Check what books did USERID #1 buy
2. Go through all rows with those books (BOOKID) and check the MIN(DATE_PURCHASE) for each row
3. Write out those rows only where the USERID = #1

您想过滤一个 group-wise minimum,它本身是使用自连接制定的(以便仅查找所需用户购买的那些书籍的首次购买日期,而不考虑购买者):

SELECT * FROM docs NATURAL JOIN (
  SELECT   BOOKID, MIN(d2.DATE_PURCHASE) DATE_PURCHASE
  FROM     docs d1 JOIN docs d2 USING (BOOKID)
  WHERE    d1.USERID = 1
  GROUP BY BOOKID
) t WHERE USERID = 1

sqlfiddle 上查看。