Mysql 如何指定分组依据应保留哪些行以及应折叠哪些行
我正在使用的应用程序包含一部分,用户可以在其中创建相册并将图像上载到相册。应用程序会创建图像的多个大小调整,以便不向用户提供大版本。有关文件的所有信息都以以下结构存储在数据库中Mysql 如何指定分组依据应保留哪些行以及应折叠哪些行,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我正在使用的应用程序包含一部分,用户可以在其中创建相册并将图像上载到相册。应用程序会创建图像的多个大小调整,以便不向用户提供大版本。有关文件的所有信息都以以下结构存储在数据库中 相册表具有id和名称 照片表有一个照片列表,每个照片都知道它属于哪个相册 还有一张照片。每个photo_版本存储photo表中对象的ID 此逻辑由以下模式表示: CREATE TABLE albums(`id` int, `name` varchar(255)); INSERT INTO albums (id, nam
CREATE TABLE albums(`id` int, `name` varchar(255));
INSERT INTO albums (id, name) VALUES
(1, "one"),
(2, "two"),
(3, "three");
CREATE TABLE photos(`id` int, `albums_id` int, `title` varchar(255));
INSERT INTO photos (id, albums_id, title) VALUES
(1, 1, "a"),
(2, 1, "b"),
(3, 1, "c");
CREATE TABLE photos_versions(`id` int, `photos_id` int, `width` int, `height` int);
INSERT INTO photos_versions (photos_id, width, height) VALUES
(1, 1000, 800),(1, 800, 600), (1, 600, 400),
(2, 1000, 800), (2, 800, 600), (2, 600, 400),
(3, 1000, 800), (3, 800, 600), (3, 600, 400);
用户界面能够请求特定的高度,我正在处理的后端应该返回数据库中最接近的现有高度。我正在按要求做这件事。它从连接所有这些表开始:
SELECT *
FROM albums a
INNER JOIN photos p ON p.albums_id = a.id
INNER JOIN photos_versions pv ON pv.photos_id = p.id;
结果如下表所示:
+------+------+----+-----------+-------+------+-----------+-------+--------+
| id | name | id | albums_id | title | id | photos_id | width | height |
+------+------+----+-----------+-------+------+-----------+-------+--------+
| 1 | one | 1 | 1 | a | NULL | 1 | 1000 | 800 |
| 1 | one | 1 | 1 | a | NULL | 1 | 800 | 600 |
| 1 | one | 1 | 1 | a | NULL | 1 | 600 | 400 |
| 1 | one | 2 | 1 | b | NULL | 2 | 1000 | 800 |
| 1 | one | 2 | 1 | b | NULL | 2 | 800 | 600 |
| 1 | one | 2 | 1 | b | NULL | 2 | 600 | 400 |
| 1 | one | 3 | 1 | c | NULL | 3 | 1000 | 800 |
| 1 | one | 3 | 1 | c | NULL | 3 | 800 | 600 |
| 1 | one | 3 | 1 | c | NULL | 3 | 600 | 400 |
+------+------+----+-----------+-------+------+-----------+-------+--------+
9 rows in set (0.00 sec)
+------+------+----+-----------+-------+------+-----------+-------+--------+
| id | name | id | albums_id | title | id | photos_id | width | height |
+------+------+----+-----------+-------+------+-----------+-------+--------+
| 1 | one | 1 | 1 | a | NULL | 1 | 1000 | 800 |
| 1 | one | 2 | 1 | b | NULL | 2 | 1000 | 800 |
| 1 | one | 3 | 1 | c | NULL | 3 | 1000 | 800 |
+------+------+------+-----------+-------+------+-----------+-------+--------+
3 rows in set (0.00 sec)
现在,我们需要按照片的id进行分组(因为我们希望得到最接近给定照片的版本)。因此,请求变成:
SELECT *
FROM albums a
INNER JOIN photos p ON p.albums_id = a.id
INNER JOIN photos_versions pv ON pv.photos_id = p.id
GROUP BY photos_id;
其结果如下表所示:
+------+------+----+-----------+-------+------+-----------+-------+--------+
| id | name | id | albums_id | title | id | photos_id | width | height |
+------+------+----+-----------+-------+------+-----------+-------+--------+
| 1 | one | 1 | 1 | a | NULL | 1 | 1000 | 800 |
| 1 | one | 1 | 1 | a | NULL | 1 | 800 | 600 |
| 1 | one | 1 | 1 | a | NULL | 1 | 600 | 400 |
| 1 | one | 2 | 1 | b | NULL | 2 | 1000 | 800 |
| 1 | one | 2 | 1 | b | NULL | 2 | 800 | 600 |
| 1 | one | 2 | 1 | b | NULL | 2 | 600 | 400 |
| 1 | one | 3 | 1 | c | NULL | 3 | 1000 | 800 |
| 1 | one | 3 | 1 | c | NULL | 3 | 800 | 600 |
| 1 | one | 3 | 1 | c | NULL | 3 | 600 | 400 |
+------+------+----+-----------+-------+------+-----------+-------+--------+
9 rows in set (0.00 sec)
+------+------+----+-----------+-------+------+-----------+-------+--------+
| id | name | id | albums_id | title | id | photos_id | width | height |
+------+------+----+-----------+-------+------+-----------+-------+--------+
| 1 | one | 1 | 1 | a | NULL | 1 | 1000 | 800 |
| 1 | one | 2 | 1 | b | NULL | 2 | 1000 | 800 |
| 1 | one | 3 | 1 | c | NULL | 3 | 1000 | 800 |
+------+------+------+-----------+-------+------+-----------+-------+--------+
3 rows in set (0.00 sec)
但是,它不一定将行与属性保持在一起(高度最接近我指定的高度)。我如何根据照片编号进行分组并选择最接近高度的照片
附加了SQL FIDLE-这里的一种方法是在查询中添加一个附加连接,该连接将限制每个照片id组具有最接近高度的照片
SELECT a.*, p.*, pv1.*
FROM albums a
INNER JOIN photos p
ON p.albums_id = a.id
INNER JOIN photos_versions pv1
ON pv1.photos_id = p.id
INNER JOIN
(
SELECT photos_id, MIN(ABS(height - SOME_HEIGHT)) AS diff
FROM photos_versions
GROUP BY photos_id
) pv2
ON pv1.photos_id = pv2.photos_id AND
MIN(ABS(pv1.height - SOME_HEIGHT)) = pv2.diff
您可以将
某些\u HEIGHT
替换为通过高度搜索获得的任何值。什么决定了应该返回哪一行?您在查询中指定的高度在哪里?@sgedes我没有,这就是我的问题所在