排序后如何分组?,mysql,join"/>

首页 > 解决方案 > 排序后如何分组?

问题描述

有一个存储产品信息的表。

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

标签: mysqljoin

解决方案


加入获取计数的子查询,而不是在加入后进行计数。

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

推荐阅读