mysql - 排序后如何分组?
问题描述
有一个存储产品信息的表。
CREATE TABLE `products` (
`idx` INT(10) NOT NULL AUTO_INCREMENT,
`reg_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`idx`)
)
并且有一个特定产品的图像表。
CREATE TABLE `fileData`
(
`idx` INT(11) NOT NULL AUTO_INCREMENT,
`file_url` VARCHAR(255) NOT NULL COLLATE 'utf8_general_ci',
`p_idx` INT(11) NULL DEFAULT NULL COMMENT 'product idx',
`imgNum` TINYINT(4) NULL DEFAULT NULL COMMENT 'fileCount',
`regdate` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`idx`)
)
文件数据
编号 | 文件网址 | p_idx | imgNum | 注册日期 |
---|---|---|---|---|
9474 | /pic/1634705274249.png | 2323 | 3 | 2021-10-20 13:47:54 |
9475 | /pic/1634705274250.png | 2323 | 4 | 2021-10-20 13:47:54 |
9476 | /pic/1634705274251.png | 2323 | 1 | 2021-10-20 13:47:54 |
9477 | /pic/1634705274284.png | 2323 | 2 | 2021-10-20 13:47:54 |
9478 | /pic/1634705274288.png | 2323 | 5 | 2021-10-20 13:47:54 |
9469 | /pic/1634611885861.jpeg | 2322 | 1 | 2021-10-19 11:51:26 |
9470 | /pic/1634611885862.jpeg | 2322 | 2 | 2021-10-19 11:51:26 |
9471 | /pic/1634611885862.jpeg | 2322 | 3 | 2021-10-19 11:51:26 |
9472 | /pic/1634611885863.jpeg | 2322 | 4 | 2021-10-19 11:51:26 |
9473 | /pic/1634611885864.jpeg | 2322 | 5 | 2021-10-19 11:51:26 |
9464 | /pic/1634549314931.jpeg | 2321 | 1 | 2021-10-18 18:28:35 |
9465 | /pic/1634549314932.jpeg | 2321 | 2 | 2021-10-18 18:28:35 |
9466 | /pic/1634549314932.jpeg | 2321 | 3 | 2021-10-18 18:28:35 |
9467 | /pic/1634549314933.jpeg | 2321 | 4 | 2021-10-18 18:28:35 |
9468 | /pic/1634549314933.jpeg | 2321 | 5 | 2021-10-18 18:28:35 |
9425 | /pic/1634544307500.png | 2314 | 4 | 2021-10-18 17:05:07 |
9426 | /pic/1634544307501.png | 2314 | 2 | 2021-10-18 17:05:07 |
9427 | /pic/1634544307517.png | 2314 | 3 | 2021-10-18 17:05:07 |
9428 | /pic/1634544307518.png | 2314 | 1 | 2021-10-18 17:05:07 |
9429 | /pic/1634544307522.png | 2314 | 5 | 2021-10-18 17:05:07 |
9424 | /pic/1634108899663.png | 2310 | 7 | 2021-10-13 16:08:20 |
管理员可以在注册产品后更改产品图像的顺序。
当顺序发生变化时,数据库中的数据也会按照每个顺序进行重构。
imgNum 1 的项目被用作缩略图。
*并且必须显示每个产品中注册的图像数量。
我想加入这两个表并获得必要的结果。或者除了加入之外还有什么好的解决方案吗?
SELECT f.imgNum, count(f.idx) AS img_cnt, p.reg_date
FROM fileData AS f
JOIN products AS p ON p.idx = f.p_idx
GROUP BY p.idx
ORDER BY p.reg_date DESC
结果:
p_idx | imgNum | 文件网址 | img_cnt | reg_date |
---|---|---|---|---|
2323 | 3 | /pic/1634705274249.png | 5 | 2021-10-20 13:47:54 |
2322 | 1 | /pic/1634611885861.jpeg | 5 | 2021-10-19 11:51:26 |
2321 | 1 | /pic/1634549314931.jpeg | 5 | 2021-10-18 18:28:35 |
2314 | 4 | /pic/1634544307500.png | 5 | 2021-10-18 17:05:08 |
2313 | 4 | /pic/1632375026407.gif | 5 | 2021-09-23 14:30:27 |
2311 | 1 | /pic/1630545720418.jpeg | 5 | 2021-09-02 10:22:01 |
2312 | 1 | /pic/1631586395031.png | 1 | 2021-09-02 10:22:01 |
2310 | 1 | /pic/1630465597465.gif | 7 | 2021-09-01 12:06:38 |
预期结果:
p_idx | imgNum | 文件网址 | img_cnt | reg_date |
---|---|---|---|---|
2323 | 1 | /pic/1634705274245.png | 5 | 2021-10-20 13:47:54 |
2322 | 1 | /pic/1634611885861.jpeg | 5 | 2021-10-19 11:51:26 |
2321 | 1 | /pic/1634549314931.jpeg | 5 | 2021-10-18 18:28:35 |
2314 | 1 | /pic/1634544307400.png | 5 | 2021-10-18 17:05:08 |
2313 | 1 | /pic/1632375026400.gif | 5 | 2021-09-23 14:30:27 |
2311 | 1 | /pic/1630545720418.jpeg | 5 | 2021-09-02 10:22:01 |
2312 | 1 | /pic/1631586395031.png | 1 | 2021-09-02 10:22:01 |
2310 | 1 | /pic/1630465597465.gif | 7 | 2021-09-01 12:06:38 |
解决方案
加入获取计数的子查询,而不是在加入后进行计数。
SELECT f.p_idx, f.imgNum, c.img_cnt, p.reg_date
FROM fileData AS f
JOIN products AS p ON p.idx = f.p_idx
JOIN (
SELECT p_idx, COUNT(*) AS img_cnt
FROM fileData
GROUP BY p_idx
) AS c ON f.p_idx = c.p_idx
WHERE f.imgNum = 1
ORDER BY p.reg_date DESC
推荐阅读
- javascript - 为什么会这样?js计算
- php - 使用 Pusher 和 Vue.js 在 Laravel 聊天中出现错误 500 Axios POST 请求
- matlab - Matlab - 求解方程组时的 vpasolve 错误
- c++ - 在 .csv 文件的单独列中写入数据
- django - 如何按计算属性的总和对 Django 模型进行排序?
- python - 退格函数 print('\b') 不起作用
- jquery - 如何使用包含在它们之间有 html 空格的单词组
- html - Bootstrap Scrollspy 和视差
- javascript - 按长度过滤国家名称
- javascript - 邮递员和 angularjs 服务中的不同响应