Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-获取10条记录,按列排序,其中某些列是唯一的_Mysql_Sql - Fatal编程技术网

Mysql SQL-获取10条记录,按列排序,其中某些列是唯一的

Mysql SQL-获取10条记录,按列排序,其中某些列是唯一的,mysql,sql,Mysql,Sql,给定一个带有时间戳列的表,我想获得10条最新记录,其中特定列是唯一的 如何做到这一点 例子: 数据: purchases ----------------------------------------------------------------- timestamp first_name last_name customer_id product_name purchase_amount James, Jackson, 1234, 'foo', 432.123 Tim,

给定一个带有时间戳列的表,我想获得10条最新记录,其中特定列是唯一的

如何做到这一点

例子: 数据:

purchases
-----------------------------------------------------------------
timestamp   first_name    last_name   customer_id  product_name  purchase_amount
James, Jackson, 1234, 'foo', 432.123
Tim, McTimothy, 321, 'bar', 5124.11
Bob, Bobbertson, 55, 'foo', 432.123
Claire, Rando, 191, 'tv', 700.00
Jimbo, Manman, 631, 'ps4', 450.00
如何获取最近购买的5位客户以及
产品名称
购买金额

结果:

purchases
-----------------------------------------------------------------
timestamp   first_name    last_name   customer_id  product_name  purchase_amount
James, Jackson, 1234, 'foo', 432.123
Tim, McTimothy, 321, 'bar', 5124.11
Bob, Bobbertson, 55, 'foo', 432.123
Claire, Rando, 191, 'tv', 700.00
Jimbo, Manman, 631, 'ps4', 450.00
我所尝试的: 此查询失败,因为它需要对
product\u name
purchase\u amount
进行聚合,但我们不需要聚合,只需要最新的值

SELECT first_name, last_name, customer_id, product_id
FROM purchases
GROUP BY first_name, last_name, customer_id
ORDER BY timestamp DESC
LIMIT 10

您可以尝试添加一个
rank
列作为
id
,如下所示:

SELECT first_name, last_name, customer_id, product_name
FROM
 (SELECT   first_name, last_name, customer_id, product_name, @rank := @rank + 1 AS rank
  FROM     purchases p1, (SELECT @rank := 0) r
  ORDER BY timestamp DESC) p2
GROUP BY first_name, last_name, customer_id
LIMIT 10;

我假设客户id是唯一的。所以我们只需要在 组子句

   select  * from  purchases p2 where 
       concat(UNIX_TIMESTAMP((p2.timestamp)),'_',p2.customer_id)  
         in ( 
                  select concat(UNIX_TIMESTAMP(max(p.timestamp)),'_',p.customer_id)
                  from purchases p group by p.customer_id order by p.timestamp desc
            ) limit 10

我认为这样可以做到:

SELECT p.*
FROM 
(  
    SELECT customer_id, MAX(timestamp) last_purchase_time
    FROM purchases
    GROUP BY customer_id
    ORDER BY MAX(timestamp) DESC
    LIMIT 5
) lp
INNER JOIN purchases p ON p.customer_id = lp.customer_id and p.timestamp = lp.last_purchase_time

嵌套查询获取每个客户的上次购买时间,并进一步将嵌套结果集限制为5个最近的客户。然后,我们将其连接回purchases表,以便查看每个客户上次购买的完整购买数据。这确实假设一个客户不可能在完全相同的情况下进行两次购买,但这可能是安全的。

在支持横向连接/应用的现代数据库中,这将更容易实现。只需在purchases表的查询中输入您的LIMIT 5,按customer_id分组并按最大时间戳订购即可获得您所需的客户,然后将其与apply/侧向联接一起使用,以获得每个客户的最新购买。不幸的是,MySql已经脱离了“现代数据库”的范畴:没有应用/横向连接,没有窗口功能,没有CTE(除非你幸运地运行了8.01服务版本),没有完全连接。。。我可以继续,所有这些都可以在Oracle、Sql Server和Postgresql中使用。@Don P-是否可以在此表中添加一个自动递增主键列?@Fathahrhmanp不幸的是,没有主键