我试图从MySQL数据库中提取最近的5条记录,然后由USER将它们组合在一起,然后在它们被分组后,获得更多记录,直到我按日期排序5个唯一的USER。理想情况下,我想用一个查询来做这件事。
数据库:
------------- | user | item | ------------- | 1 | aaa | | 3 | bbb | | 1 | ccc | | 2 | ddd | | 3 | iii | | 4 | eee | | 6 | fff | | 5 | ggg | | 1 | hhh | -------------
现在,我有这个问题:
SELECT user,GROUP_CONCAT(item)
FROM database
GROUP BY user
ORDER BY date DESC
LIMIT 5
但这为我提供了5个唯一记录,每个唯一的USER包含所有项目,如下所示:
-------------------- | user | items | -------------------- | 1 | aaa,ccc,hhh | | 3 | bbb,iii | | 2 | ddd | | 4 | eee | | 6 | fff | --------------------
在前面的示例中,用户1不应该具有项目“hhh”,因为在该记录之前有7个记录具有5个唯一的USER。相反,我希望它拉出前5个记录(结束于USER 3 iii),然后将用户1和用户3重复记录分组,然后再获得两个记录以达到LIMIT 5,如下所示:
-------------------- | user | items | -------------------- | 1 | aaa,ccc | | 3 | bbb,iii | | 2 | ddd | | 4 | eee | | 6 | fff | --------------------
这可能与单个查询有关,所以我不必拉记录,合并,然后拉更多记录?
我真的不明白为什么你需要这种奇怪的选择,但这可能会帮助你至少开始:
SELECT u.user, u.item FROM
(SELECT db.user, group_concat(db.item) as item
FROM (
SELECT user, item
FROM database
ORDER BY date DESC
LIMIT 5
) db
UNION
SELECT user, item
FROM database
WHERE user not in (
SELECT user
FROM database
ORDER BY date DESC
LIMIT 5
) db
ORDER BY date DESC
limit 5) u
LIMIT 5;
两个subselect都获得了5个最新结果。然后从第一个我们获得agrupation,从另一个我们得到用户排除。我们将结果结合起来然后限制结果,因为我们不知道(我们这样做,但不是更一般的情况)我们将在第一个选择上获得的结果量。
请尝试以下查询
SELECT a.user , GROUP_CONCAT(a.item)
FROM ( select user , item from database
GROUP BY user
ORDER BY date DESC LIMIT 5 ) as a;
我想你可以在子查询上使用row_number() over(partition_by user) AS user_occurence_num
,它会给你:
--------------------------------
| user | item |user_occurence_num|
|------|------|------------------|
| 1 | aaa |1 |
| | | |
| 3 | bbb |1 |
| | | |
| 1 | ccc |2 |
| 2 | ddd |1 |
| 3 | iii |2 |
| 4 | eee |1 |
| | | |
| 6 | fff |1 |
| | | |
| 5 | ggg |1 |
| | | |
| 1 | hhh |3 |
---------------------------------
然后过滤user_occurence_num = 1 LIMIT 5
的子查询以获得结果。