在单个查询中为每个 DISTINCT 记录选择多条记录

2024-01-28

我需要为每个不同的记录选择几行。几乎就像这里问的那样在 SQL Server 2008 中为每个不同 ID 选择前 n 条记录 https://stackoverflow.com/questions/3364224/select-first-n-records-for-each-distinct-id-in-sql-server-2008,虽然我使用MySQL。

在这种情况下,可以通过运行 21 个查询来实现目的:1 个常规查询和 20 个查询来获取子记录,即如下所示:

SELECT DISTINCT `user_id`
FROM `posts`
WHERE `deleted` = '0'
ORDER BY `user_id` ASC
LIMIT 20

...选择所需的所有行,然后

SELECT *
FROM `posts`
WHERE `deleted` = '0'
AND `user_id` = ?
ORDER BY `id` DESC
LIMIT 5

...在第一个查询选择的每一行的循环中。

基本上,我需要获取每个用户的 5 个帖子。我需要在单个查询中完成此操作。这posts设置只是一个例子,我做了这个,所以希望它更容易理解我的需要。

我从以下查询开始:

SELECT * 
FROM `posts` 
WHERE `user_id` 
IN (
    SELECT DISTINCT `user_id` 
    FROM `posts` 
    ORDER BY `user_id` DESC 
    LIMIT 4
) 
LIMIT 5

但我明白了#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' error.

所以我尝试过JOIN像建议的想法here https://stackoverflow.com/a/2856430/722036:

SELECT  posts.id,
        posts.user_id,
        NULL
FROM    (
        SELECT  posts.user_id
        FROM    posts
        WHERE   posts.deleted = 0
        LIMIT 20
        ) q
JOIN    posts
ON      posts.user_id = q.user_id

我还按照建议尝试了几个嵌套查询here https://stackoverflow.com/a/7124492/722036:

SELECT *
FROM posts 
WHERE user_id IN (
      SELECT * FROM (
            SELECT user_id 
            FROM posts 
            LIMIT 20
      ) 
      as t);

以及网上找到的其他解决方案。但它们要么不起作用,要么只是简单地从数据库中选择前 N 行(无论条件和出于某种原因的连接如何)。尝试过LEFT JOIN, RIGHT JOIN, even INNER JOIN,但仍然没有成功。

请帮忙。

UPDATE忘了说该表的大小约为 5GB。

UPDATE尝试了子子查询:

SELECT * 
FROM `posts` 
WHERE
  `user_id` IN ( SELECT `user_id` FROM (
     SELECT DISTINCT `user_id` 
     FROM `posts` 
    ORDER BY `user_id` DESC 
    LIMIT 4 ) limit_users
  ) 
LIMIT 5

与上面相同,它返回以下内容:

+----+---------+------+
| id | user_id | post |
+----+---------+------+
|  1 |       1 |    a |
+----+---------+------+
|  2 |       1 |    b |
+----+---------+------+
|  3 |       1 |    c |
+----+---------+------+
| .. |      .. |   .. |

IE。 5(这是外部的LIMIT设置为)同一用户的行。奇怪的是,如果我单独运行子查询和子子查询:

    SELECT `user_id` FROM (
     SELECT DISTINCT `user_id` 
     FROM `posts` 
    ORDER BY `user_id` DESC 
    LIMIT 4 ) limit_users

我得到 4 个不同的值:

+---------+
| user_id |
+---------+
|       1 |
+---------+
|       2 |
+---------+
|       3 |
+---------+
|       4 |
+---------+

您必须使用变量,对有序查询执行两种不同的计数:一种是针对每个用户的帖子数量,另一种是针对用户:

SELECT posts_counts.*
FROM (
  SELECT
    posts.*,
    @post_count:=case when @prec_user_id=user_id then @post_count+1 else 1 end as pc,
    case when @prec_user_id<>user_id then @user_count:=@user_count+1 else @user_count end as uc,
    @prec_user_id:=user_id
  FROM
    posts,
    (select @prec_user_id:=0, @user_count:=0, @post_count:=0) counts
  ORDER BY
    posts.user_id ) posts_counts
WHERE pc<5 and uc<4

EDIT:您也可以考虑尝试以下查询:

SELECT * 
FROM `posts` 
WHERE
  `user_id` IN ( SELECT user_id FROM (
     SELECT DISTINCT `user_id` 
     FROM `posts` 
    ORDER BY `user_id` DESC 
    LIMIT 4 ) limit_users
  ) 
LIMIT 5

(这只会从每个选定用户的所有帖子中选择 5 个帖子,所以它仍然不是您需要的,但它使用了一个技巧,在子子查询中使用 LIMIT)

EDIT2:下一个查询将限制 20 个用户中每人 5 个帖子:

select posts_limited.*
from (
  select
    posts.*,
    @row:=if(@last_user=posts.user_id, @row+1, 1) as row,
   @last_user:=posts.user_id
  from
    posts inner join
    (select user_id from
      (select distinct user_id
       from posts
       order by user_id desc
       LIMIT 20) limit_users
    ) limit_users
    on posts.user_id = limit_users.user_id,
    (select @last_user:=0, @row:=0) r
  ) posts_limited
  where row<=5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在单个查询中为每个 DISTINCT 记录选择多条记录 的相关文章

  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • 如何使PHP中的激活链接过期?

    我有一个 php 脚本 它通过电子邮件向用户发送激活链接 以便他们可以激活他们的帐户 链接是这样的 mysite com activation phpid id 20 如何创建 24 小时后过期的链接 我还没有尝试过任何东西 因为我找不到任
  • MYSQL 查询返回“资源 id#12”而不是它应返回的数值

    不知道为什么 但这返回了错误的值 我正在取回此资源 ID 12 而不是我正在寻找的数值 1 执行此操作的代码是 type SELECT account type from user attribs WHERE username userna
  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • MySQL+子串怎么做? + 替换?

    我不太擅长 SQL 希望能够变得更好 我在尝试执行某些表操作时遇到一些麻烦 我希望能够从下面的 ProgUID 列中选择子字符串 就像是 SUBSTRING table ProgUID 3 12 这将为我提供 ProgUID P CAMVE
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • MySQL 全文搜索不适用于某些单词,例如“house”

    我已经在 3 个字段中的一小部分记录上设置了全文索引 也尝试了 3 个字段的组合 并得到了相同的结果 有些单词返回结果很好 但某些单词如 house 和 澳大利亚 不这样做 有趣的是 澳大利亚 和 家乡 这样做 这似乎是奇怪的行为 如果我添
  • 将记录分成两列

    我的数据库中有一个 学生 表 其中包含大约 5 000 条记录 我想将这些记录显示在two分区 如何在不执行查询两次的情况下做到这一点 仅使用单个查询 显示示例http www freeimagehosting net uploads f1
  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 无法启动 MySQL 服务器 - 控制进程退出并出现错误代码

    我的 mysql 服务器停止后无法启动 命令使用 sudo etc init d mysql restart Error 重新启动 mysql 通过 systemctl mysql serviceJob for mysql service
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • 如何在 PHPUnit 测试中显示底层测试方法?

    我有测试套件 里面有很多测试 这是一个中等大小的 ok 4 CommodityBasketTest testStartsOutEmpty ok 5 CommodityBasketTest testCanAddACommodity ok 6
  • 为什么不应该使用 F# 异步工作流程来实现并行性?

    我最近一直在学习 F 对其轻松利用数据并行性特别感兴趣 这data gt Array map gt Async Parallel gt Async RunSynchronously习语似乎很容易理解 易于使用并从中获得真正的价值 那么为什么
  • 如何将 git 存储库设置为只读?

    我有一些通过 SSH 远程访问的 git 存储库 我想将其中一些设置为只读以防止更多推送 有些人有指向这些存储库的遥控器 这些裸存储库已初始化 shared group 那么将所有文件的文件权限设置为 660 是否足以仍然允许 SSH 访问
  • 如何在 python 中转义正斜杠,以便 open() 将我的文件视为要写入的文件名,而不是要读取的文件路径?

    让我先说我是不太确定我的代码发生了什么 我对编程相当陌生 我一直在为我的 python CS 课程创建一个单独的最终项目 该项目每天检查我老师的网站 并确定自上次程序运行以来他是否更改了他网站上的任何网页 我现在正在执行的步骤如下 def
  • 如何解决Sonar错误:无法加载组件类org.sonar.scanner.scan.ProjectLock

    我在 netbeans 项目上运行 Sonar 时遇到一些问题 它不起作用 我有以下错误 C Users remy fischer Desktop NetBeansProjects NetBeansProjects BinPacking s
  • Xcode 项目在文档大纲中显示为灰色

    我一直在使用 iCloud 将我正在处理的 Xcode 项目从笔记本电脑 同步 到桌面 不幸的是 它似乎运作得不太好 我今天在台式机上打开了一个昨天在笔记本电脑上工作的项目 If I open the file on the desktop
  • 使用 jQuery 获取 ListBox 中选定项目的数量

    如主题中所述 当用户选择新项目时 如何使用 jQuery 获取 ListBox 中选定项目的计数 我有这些代码 Html ListBoxFor x gt Model StatesID Model States new class chzn
  • 十进制小时变成时间?

    我在数据库中有一个小时字段 例如 1 4 1 5 1 7 我需要将其转换回 HH MM 做到这一点最简单的方法是什么 TimeSpan FromHours http msdn microsoft com en us library syst
  • HttpSessionListener 不起作用

    我已经实现了 HttpSessionListiner 但它不起作用 用调试器检查 输入 servlet 后创建新会话 登录后 JSESSION ID 发生变化 但 session getCreateTime 保持不变 会话保持不变 使用注释
  • Erlang集群

    我正在尝试使用 Erlang 作为将所有组件粘合在一起的粘合剂来实现一个集群 我喜欢它创建一个完全连接的节点图的想法 但在在线阅读不同的文章后 似乎这不能很好地扩展 最多有 50 100 个节点 OTP 的开发者是否故意施加此限制 我确实知
  • 调用未定义函数curl_file_create() [文件处理]

    我正在尝试使用curl上传文件 在PHP文档中它说 要发布文件 请在文件名前面添加 并使用完整路径 可以通过在文件名后面加上格式为 type mimetype 的类型来显式指定文件类型 此参数可以作为 urlencoded 字符串 如 pa
  • FBSDK 登录错误代码:Objective-C 中的 308

    我不断得到 Error Domain com facebook sdk login Code 308 操作无法 完成 com facebook sdk login 错误 308 尝试从我的设备登录 Facebook 时 我的代码可以在模拟器
  • WebKit 及其遗留前缀

    我正在尝试编译特性前缀为 apple and khtml WebKit 支持哪些and since 哪个版本它们最终被放弃或引入 他们受到什么限制 例如 您可以在以下位置找到它们吗 document body style 我猜只有像记者这样
  • 共同好友数量最多的好友

    我想找到我与他们共同好友数量最多的朋友 我尝试使用 FQL 和图形 API 按以下方式执行此操作 获取当前登录用户的好友列表 FQL SELECT uid1 FROM friend WHERE uid2 MY USER ID and uid
  • Cin 无需等待输入?

    对于我正在开发的项目 我需要程序能够接收用户的输入 但是当他们输入某些内容时 程序可以继续循环 For example while true if userInput true cin gt gt input DO SOMETHING 这意
  • 标记数据和未标记数据有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 In this http www youtube com watch v qkcFRr7LqAw在 Sebastian Thrum 的视频
  • 我可以在以后的版本中更改 Android 应用程序图标和名称吗?

    这在某种程度上听起来很愚蠢 但我想知道是否可以在后续版本中更改应用程序徽标 图标 和 Android 名称 比如说 今天我在 Android 市场上推送我的应用程序 明天我想更改徽标 图标 我知道我 不应该 这样做 但是可以这样做吗 另外
  • 使用 OpenVPN 创建 VPN

    我在 Android 10 上连接 VPN 时遇到问题 并在 logcat 中收到以下消息 这是权限错误 寻找解决方案 还在 Mainfest 中添加了 android requestLegacyExternalStorage true 但
  • 在 XSLT 中,在使用时计算设置为 name(..) 之类的变量是否正常?

    我的 XML 中有几棵树 想要根据另一棵树的名称来访问其中一棵树 这里被称为tab name它是当前节点的父标签 所以我使用 name 如果我在设置变量的同一位置进行测试 这会给我正确的值 然而 我遇到的问题是 当我引用 tab name
  • 在单个查询中为每个 DISTINCT 记录选择多条记录

    我需要为每个不同的记录选择几行 几乎就像这里问的那样在 SQL Server 2008 中为每个不同 ID 选择前 n 条记录 https stackoverflow com questions 3364224 select first n