Mysql SQL:通过Select查询以特定(静态)顺序检索数据

Mysql SQL:通过Select查询以特定(静态)顺序检索数据,mysql,select,Mysql,Select,我目前正在尝试创建一个MySQL查询,它使用静态顺序从特定表(图像)输出数据。我目前正在使用UNION ALL来做这件事,但我现在有点卡住了 以下是我想要它做的: 我有一个名为images的表,其中包含以下字段:user\u id、image、image\u dimension(此字段值:小、宽、高、大) 从images表中,我希望以静态顺序检索具有特定维度的图像,以便将它们放入我的静态图像网格中。现在它变得复杂了:我只希望每个用户id有一(1)个图像 这是我迄今为止的尝试: SELECT

我目前正在尝试创建一个MySQL查询,它使用静态顺序从特定表(图像)输出数据。我目前正在使用UNION ALL来做这件事,但我现在有点卡住了

以下是我想要它做的:

我有一个名为images的表,其中包含以下字段:user\u id、image、image\u dimension(此字段值:小、宽、高、大)

从images表中,我希望以静态顺序检索具有特定维度的图像,以便将它们放入我的静态图像网格中。现在它变得复杂了:我只希望每个用户id有一(1)个图像

这是我迄今为止的尝试:

SELECT
    *
FROM
(

    (SELECT * FROM `artworks` WHERE img = 'Large' LIMIT 1)
    UNION ALL
    (SELECT * FROM `artworks` WHERE img = 'Small' LIMIT 2)
    UNION ALL
    (SELECT * FROM `artworks` WHERE img = 'Large' LIMIT 1)
    UNION ALL
    (SELECT * FROM `artworks` WHERE img = 'Wide' LIMIT 1)
    UNION ALL
    (SELECT * FROM `artworks` WHERE img = 'Small' LIMIT 2)
    UNION ALL
    (SELECT * FROM `artworks` WHERE img = 'Tall' LIMIT 2)
    UNION ALL
    (SELECT * FROM `artworks` WHERE img = 'Large' LIMIT 1)
) AS order
此查询从表“images”中提取具有特定维度的图像,并限制-我获取订单所需的数量。到目前为止,这是可行的,但它不允许我在保持订单的同时,每个用户id只能获得一张图像

如何确保获得订单(请参见查询),但每个用户id只能获得一张图像

订单是:1个大,2个小,1个大,1个宽,2个小,2个高,1个大)

对不起,我的英语不好,如果你需要进一步的描述,请告诉我

编辑:

Table format artworks:
id | user_id | img_name | img

Sample data from artworks:
1  | 1       | Test 1   | Large
2  | 1       | Test 2   | Large
3  | 2       | Test 3   | Small
4  | 2       | Test 4   | Small
5  | 2       | Test 5   | Small
6  | 3       | Test 6   | Small
7  | 3       | Test 7   | Small
8  | 3       | Test 8   | Small
9  | 4       | Test 9   | Large
10 | 4       | Test 10  | Large
11 | 5       | Test 11  | Small
12 | 5       | Test 12  | Wide
13 | 6       | Test 13  | Small
14 | 7       | Test 14  | Small

My expected result (ORDER BY id DESC) to get latest img of each user:

2  | 1       | Test 2   | Large
5  | 2       | Test 5   | Small
8  | 3       | Test 8   | Small
10 | 4       | Test 10  | Large
12 | 5       | Test 12  | Wide
13 | 6       | Test 13  | Small
14 | 7       | Test 14  | Small

在这种情况下,有一种方法我还没有测试过,但想法是正确的,那就是在数据库中构建一个包含图像排列的helper表,如下所示:

----- --------
size  ordering
----- --------
Large 1
Small 2
Small 3
Large 4
Wide  5
Small 6
Small 7
Tall  8
Tall  9
Large 10
然后,您需要构造一个查询,该查询将拉出一个与订购号成对的用户列表,如下所示:

SET    @ordering = 0;

SELECT artwork.*
FROM   arrangement
JOIN  (SELECT @ordering := @ordering + 1 AS ordering, user_id
       FROM   users) AS ordered_users
       ON arrangement.ordering = ordered_users.ordering
JOIN   artwork ON ordered_users.user_id = artwork.user_id AND
                  arrangement.size = artwork.img
GROUP BY ordering ASC;
这里的诀窍是,
@ordering
变量递增,并为查询的
用户
表的每一行进行设置,然后可以通过排序号与
排列
表中的条目配对,以配对用户、图像大小和排列顺序。一旦你做到了这一点,你就可以将它们与图像匹配。(Ab)使用具有MySQL特定行为的
GROUP BY
(而不是
ORDER BY
)可以消除用户可能具有的相同大小的任何图像,并通过某种任意方法有效地选择其中一个图像

这种方法远远不够理想,特别是因为它滥用了一些特定于MySQL的行为,尽管这种滥用可以通过相关子查询消除。然而,它至少可以给你一些解决问题的方法


也就是说,这种事情与SQL不完全一样。

Dave,您能给我们看一下您的
表格artworks
字段和样本数据吗?如果可能,请以表格形式向我们提供您的最终预期输出。为什么要订购?你想做什么?你真的想让数据库做一些它不打算做的事情。您真正应该做的是获得3倍大、4倍小、1倍宽和2倍高的图像,然后在您自己的代码中适当地对获取的条目进行排序。如果用户有许多不同大小的图像,那么它必须为他获得哪种大小的图像?这也限制了下一个人的选择。这里的变量太多。我用样本数据和预期结果编辑了我的问题。@Keith:那么你是说最好的方法是提取图像的数量,然后用php进行排序?我想在mysql中可能会有这样的方法。谢谢你的努力Keith!我知道这不是一个完美的解决方案,我愿意接受任何建议。我在服务器端使用PHP,但我还没有找到一种方法从mysql中提取(3倍大,4倍小,1倍宽,2倍高),然后使用PHP以静态方式对这些结果进行排序,我需要它们。当我在几个小时后下班回来时,我会看看是否能想出更好的方法(我会检查上面可能的解决方案)。如果其他人到那时还没有想出一个合适的解决方案,而我想出了更好的办法,我会把它贴在这里。我很感激基思!谢谢!