MySQL - 按单列对结果进行分组以及 ORDER BY 和 LIMIT

标签 mysql group-by sql-order-by limit

我想从我的数据库中选择任务列表。这些任务有一个category_id。我想为每个 category_id 获取一个单一任务。因此,例如,如果我有 10 个任务,它们链接到 6 个类别,则会产生 6 个结果。我想要的6个结果由它们的id确定,GROUP BY中最低的id是该GROUP的正确记录。此外,最大结果集不能大于 20(“LIMIT”)。

SELECT * FROM `task` WHERE `datetime`<NOW()  `task_status_id`=1 GROUP BY `category_id` ORDER BY `id` ASC LIMIT 20

上面的查询有什么问题,我不知道,我也无法获得任何谷歌结果。

稍后添加

http://sqlfiddle.com/#!9/fa39cf

CREATE TABLE `category` (
  `id` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `category` (`id`) VALUES
(1),
(2),
(3);


CREATE TABLE `task` (
  `id` int(10) UNSIGNED NOT NULL,
  `category_id` int(10) UNSIGNED NOT NULL,
  `task_status_id` int(10) UNSIGNED DEFAULT '1',
  `datetime` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `task` (`id`, `category_id`, `task_status_id`, `datetime`) VALUES
(3, 2, 1, '2018-07-24 11:20:26'),
(4, 2, 1, '2018-07-24 11:20:26'),
(5, 3, 1, '2018-07-24 11:21:35'),
(6, 3, 1, '2018-07-24 11:21:35');

最佳答案

您可以尝试首先找到每个类别的最小 ID,然后将其与任务表连接以获取剩余的详细信息。

SELECT t.* FROM task t 
JOIN (SELECT category_id, min(id) id from task group by category_id) tc 
    ON (t.id = tc.id)
LIMIT 20

关于MySQL - 按单列对结果进行分组以及 ORDER BY 和 LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057946/

相关文章:

mysql - 如何将记录选择为单个记录以确定时间差

r - 按组计算总缺失值?

mysql - 检查用户匹配数组是否作为具有匹配列的链接表中的条目存在

mysql - 你如何在 MySQL 中按小时增量分组?

php - 如何在没有 foreach 循环的情况下在 codeigniter 中使用 $query->result() 从数据库中获取数据?

mysql - 当记录通常已经存在时如何有效地使用 first_or_initialize

mysql:非常简单的 SELECT id ORDER BY LIMIT 不会按预期使用 INDEX(?!)

php - MYSql ORDER BY CASE 第一个 CASE 应按 ID 数组排序

mysql - SQL ORDER BY 查询

mysql - 控制在 jpa 中创建表的顺序