MySQL SELECT 8 个唯一用户,然后 SELECT 这 8 个用户中的所有记录,然后 SELECT 每 8 个用户的 4 个最新且可用的记录?

标签 mysql sql

我有一个数据库(日期只是为了订购的示例)...

 ---------------------
| user | item |  date |
 ---------------------
|    1 |    a |   123 |
|    3 |    b |   124 |
|    1 |    c |   125 |
|    2 |    d |   126 |
|    5 |    i |   127 |
|    4 |    e |   128 |
|    6 |    f |   129 |
|    9 |    g |   130 | 
|    3 |    h |   131 |
|    9 |    s |   132 |
|    1 |    j |   133 |
|    2 |    k |   134 |
|    1 |    l |   135 |
|    1 |    m |   136 |
|    1 |    n |   137 |
|    8 |    o |   138 |
|    5 |    p |   139 |
|    9 |    q |   140 |
|    7 |    r |   141 |
 ---------------------

我想获取前 8 个唯一用户的所有记录,这将使结果...

 ---------------------
| user | item |  date |
 ---------------------
|    1 |    a |   123 |
|    3 |    b |   124 |
|    1 |    c |   125 |
|    2 |    d |   126 |
|    5 |    i |   127 |
|    4 |    e |   128 |
|    6 |    f |   129 |
|    9 |    g |   130 | 
|    3 |    h |   131 |
|    9 |    s |   132 |
|    1 |    j |   133 |
|    2 |    k |   134 |
|    1 |    l |   135 |
|    1 |    m |   136 |
|    1 |    n |   137 |
|    8 |    o |   138 |
 ---------------------

然后,我想从这些记录中获取每个唯一用户的最新 4 条记录,使结果看起来像...

 ---------------------
| user | item |  date |
 ---------------------
|    3 |    b |   124 |
|    2 |    d |   126 |
|    5 |    i |   127 |
|    4 |    e |   128 |
|    6 |    f |   129 |
|    9 |    g |   130 | 
|    3 |    h |   131 |
|    9 |    s |   132 |
|    1 |    j |   133 |
|    2 |    k |   134 |
|    1 |    l |   135 |
|    1 |    m |   136 |
|    1 |    n |   137 |
|    8 |    o |   138 |
 ---------------------

理想情况下,我可以通过一个查询来完成此操作。我能得到的最接近的是这个查询:

SELECT users, 
GROUP_CONCAT(items) 
FROM db 
GROUP BY users 
ORDER BY date 
LIMIT 8

但是 GROUP_CONCAT 返回该用户的所有结果,而不仅仅是选择中的金额。

我也尝试过...

SELECT users
FROM db AS u1
JOIN (SELECT DISTINCT users FROM db) AS u2 ON u1.users = u2.users

来 self 发现的另一个建议,但这也不起作用。

我尝试过很多其他的东西,但我没有真正保存下来,因为它们不起作用,而且我非常有信心我能弄清楚,但已经过去两周了,我还没有接近。如果有任何 SQL 专家可以为我指明正确的方向,那就太好了。谢谢。

最佳答案

希望这可以帮助你。

--get all records up to the first 8 unique users,depending on there first order date
 select distinct a.user,a.date as first_order_date from yourtable as a where 
 a.date = (select MIN(date) from yourtable as b where a.user=b.user) order by a.date LIMIT 8

然后使用上面的结果获取每个唯一用户的最新 4 条记录,如下所示:

select * from yourtable as t where t.date in 
(select date from yourtable as t2 where t.user=t2.user order by t2.date desc LIMIT 4 ) and 
t.user in (select distinct a.user,a.date as first_order_date from yourtable as a
where a.date = (select MIN(date) from yourtable as b where a.user=b.user) order by a.date LIMIT 8)

引用文献:

correlated subqueries

Example

关于MySQL SELECT 8 个唯一用户,然后 SELECT 这 8 个用户中的所有记录,然后 SELECT 每 8 个用户的 4 个最新且可用的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55546534/

相关文章:

sql - Providex 查询性能

php - MySQL 行校验和

mysql - DISTINCT 是否总是会为相同的 SQL 返回相同顺序的值?

mysql - 为什么上下文连接字符串没有更新

mysql - 查询显示租金何时逾期?

mysql - SQL 在选择中进行选择

php - 加入两个表和总计问题

mysql 只选择具有一定长度的组

mysql - joomla 数据库没有响应

mysql - 使用连接检索空值时的困惑