我是sql新手,经历了很多讨论和youtube,但我更困惑了.

我用SELECT * FROM tp_posts来列出我网站上的帖子数量,所以下面是我的表的基本情况.


          table name tp_posts
==========================================
|  ID       |       post   | tp_product
=================================================
|   1       |  toyota 1    | toyota
|   2       |  mercedez 1  | mercedez
|   3       |  bmw 1       | bmw
|   4       |  toyota 2    | toyota
|   5       |  toyota 3    | toyota
|   6       |  toyota 4    | toyota
==========================================

上表是一个示例,您可以看到,如果我使用上面提到的普通查询,它将显示上面的所有i项,所以我开始使用这个

SELECT * FROM tp_posts GROUP BY tp_product


this works but it only shows the first toyota post and hide the latest ones and order by is not working also as group by hide the other posts

我想在过滤共享相同tp\U产品列的相关帖子时显示最新帖子,它必须显示上表中最后一篇丰田帖子


          table name tp_posts
========================================================
|  ID       |       post   | tp_product      post_numb
========================================================
|   1       |  toyota 1    | toyota        |   1
|   2       |  mercedez 1  | mercedez      |   1
|   3       |  bmw 1       | bmw           |   1
|   4       |  toyota 2    | toyota        |   2
|   5       |  toyota 3    | toyota        |   3
|   6       |  toyota 4    | toyota        |   4
==========================================

现在更新这是完整的表格,因为您可以看到上面的post部分和post\u num在post上相关.它显示丰田1 tp\u产品,产品类型=丰田,post\u numb=1,代表丰田1在post部分.

有些人建议我使用order by,但它不是这样的,因为我以任何一种方式获得表中的所有帖子,我希望得到如下表所示的结果


table name tp_posts
========================================================
|  ID       |       post   | tp_product      post_numb
========================================================
|   6       |  toyota 4    | toyota        |   4
|   3       |  bmw 1       | bmw           |   1
|   2       |  mercedez 1  | mercedez      |   1

======================================================

我想在我的查询中得到以上结果,如果我不够清楚,很抱歉,谢谢

推荐答案

您可以使用ROW_NUMBER()函数生成按tp_product划分的行号,然后按post_numb降序排列;考虑到最大的post_numb将是"最新的".将其作为子查询并执行WHERE Rnum=1以仅返回被视为"最新"的查询:

SELECT ID, post, tp_product, post_numb
   FROM
(SELECT ID, post, tp_product, post_numb,
       ROW_NUMBER() OVER (PARTITION BY tp_product ORDER BY post_numb DESC) AS Rnum
    FROM tp_posts) v
    WHERE Rnum=1;

然而,这只适用于MySQL v8+和MariaDB v10.2+.

Demo

Mysql相关问答推荐

加载数据本地infile,字段中有双引号和逗号

筛选器中的Case When语句

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

SQL查询连接到多个类别的项目

实体内约束的唯一增量 ID 生成

如何解码存储在带有type*:前缀的base64中的数据?

go&mysql&docker 拒绝连接

将sql查询转换为sequelize

为什么这个查询需要超过 5 秒才能运行?

使用另一个表中的值更新一个表中的值

JOOQ:如何将 POJO 列序列化为 JSON

MYSQL如何将虚拟列添加到现有表中

MySQL查询根据同一表中其他字段的值更新表中的字段

SQL 中的双杠 (||) 是什么意思?

MySQL Group By 和 Sum 其他列的总值

MySQL - 使一对值唯一

从mysql中的大表中快速 Select 随机行

在 Yii2 中执行原始 SQL 查询?

如何从邮箱地址中 Select 域名

MySQL讲解查询理解