【问题标题】:How can I get 5 records for each 'category' with one select in MySQL?如何在 MySQL 中通过一次选择为每个“类别”获取 5 条记录?
【发布时间】:2015-12-02 17:47:49
【问题描述】:

我有桌子topics:

ID title body ctg_topic_id ... 
1  aaa   bbb  1            ...
2  aa2   bb2  2            ...
3  aa3   bb3  1            ...
4  aa4   bb4  3            ...
5  aa5   bb5  3            ...
6  aa6   bb6  1            ...
.......
105 a105 b105 23       ...

如何通过 1 次选择为每个 ctg_topic_id 获取 5 条记录?

【问题讨论】:

  • 你想如何为每个ctg_topic_id选择5条记录?
  • @Tim Biegeleisen 感谢您的评论。最新的“创建”列。
  • @Gabrielo 使用LIMIT 恐怕在这里无济于事。
  • 这在 MySQL 中是不容易做到的。您可能需要编写一个自定义函数来帮助您。
  • 如果日期在ctg_topic_id 中全部同步,则可以采用一个逃生计划。在这种情况下,您可以只使用 WHERE 子句进行限制以达到正确的记录数。或者,如果您要为每个 ctg_topic_id 组添加一个计数器,那么这也会简化事情。

标签: php mysql


【解决方案1】:

这个 mysql 的 SQL 脚本会给你前五只猫。

SELECT * FROM your_table WHERE ctg_topic_id IN (SELECT DISTINCT ctg_topic_id from your_table) GROUP BY ctg_topc_id LIMIT 0,5

通过 PHP。 (我省略了PHP连接代码)

首先,获取列表;

$stm = $pdo->preprare("SELECT DISTINCT cth_topc_id FROM my_table");
$stm->execute():
$cats = $stm->fetchAll();
$result = array();
foreach ($cats as $cat) {
$query = $pdo->prepare("SELECT * my_table WHERE cth_topic_id=? LIMIT 0,5");
$query->bindParams(1,$cat);
$pdo->execute();
$result[$i] = $query->fetchAll();
}

此简化代码应生成一个包含 N 个数组(其中 N 是不同猫的数量)的矩阵,其中包含一个由结果集的 5 个元素组成的数组。

我没有检查代码,所以任何提示都会得到纠正,谢谢。

一个问题是 LIMIT 0,5 将获得前 5 个项目,没有任何逻辑。如果您想使用 ORDER BY 进行排序,例如按 ('date') 等。

【讨论】:

  • 非常感谢您的回答。抱歉,我在“Sequel Pro”中收到“子查询返回超过 1 行”
  • 尝试 SELECT * FROM your_table WHERE ctg_topic_id IN (SELECT DISTINCT ctg_topic_id from your_table) GROUP BY ctg_topc_id LIMIT 0,5 用 IN 操作数替换等号
  • 抱歉,您是对的,更改为“IN”确实可以正常工作。抱歉,Yuri,还有一条,它总共给了我 5 条记录(LIMIT 0,5)。是否可以为每个 ctg_topic_id 提供 5 条记录?感谢您的帮助。
  • 但此解决方案无法针对任意大(且可能未知)的组集进行扩展。
  • 在这种情况下,他可能会使用服务器端语言来完成这项工作。
【解决方案2】:
SELECT ctg_topic_id from something, GROUP BY ctg_topic_id....

它将选择所有类别..

【讨论】:

    【解决方案3】:

    你不能。您可以使用 UNION 进行一个查询或阅读此How to select the first/least/max row per group in SQL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-17
      • 2010-09-15
      • 2012-12-24
      • 2020-05-29
      • 2013-09-01
      • 2023-03-05
      • 2020-10-24
      相关资源
      最近更新 更多