Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何指定分组依据应保留哪些行以及应折叠哪些行_Mysql_Sql_Sql Order By - Fatal编程技术网

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

我正在使用的应用程序包含一部分,用户可以在其中创建相册并将图像上载到相册。应用程序会创建图像的多个大小调整,以便不向用户提供大版本。有关文件的所有信息都以以下结构存储在数据库中

  • 相册表具有id和名称
  • 照片表有一个照片列表,每个照片都知道它属于哪个相册
  • 还有一张照片。每个photo_版本存储photo表中对象的ID
  • 此逻辑由以下模式表示:

    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我没有,这就是我的问题所在