我有一个数据库(日期只是为了订购的示例)...
--------------------- | 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)
引用文献:
关于MySQL SELECT 8 个唯一用户,然后 SELECT 这 8 个用户中的所有记录,然后 SELECT 每 8 个用户的 4 个最新且可用的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55546534/