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 上查看。
此 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 上查看。