Mysql SQL:通过Select查询以特定(静态)顺序检索数据
我目前正在尝试创建一个MySQL查询,它使用静态顺序从特定表(图像)输出数据。我目前正在使用UNION ALL来做这件事,但我现在有点卡住了 以下是我想要它做的: 我有一个名为images的表,其中包含以下字段:user\u id、image、image\u dimension(此字段值:小、宽、高、大) 从images表中,我希望以静态顺序检索具有特定维度的图像,以便将它们放入我的静态图像网格中。现在它变得复杂了:我只希望每个用户id有一(1)个图像 这是我迄今为止的尝试:Mysql SQL:通过Select查询以特定(静态)顺序检索数据,mysql,select,Mysql,Select,我目前正在尝试创建一个MySQL查询,它使用静态顺序从特定表(图像)输出数据。我目前正在使用UNION ALL来做这件事,但我现在有点卡住了 以下是我想要它做的: 我有一个名为images的表,其中包含以下字段:user\u id、image、image\u dimension(此字段值:小、宽、高、大) 从images表中,我希望以静态顺序检索具有特定维度的图像,以便将它们放入我的静态图像网格中。现在它变得复杂了:我只希望每个用户id有一(1)个图像 这是我迄今为止的尝试: SELECT
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以静态方式对这些结果进行排序,我需要它们。当我在几个小时后下班回来时,我会看看是否能想出更好的方法(我会检查上面可能的解决方案)。如果其他人到那时还没有想出一个合适的解决方案,而我想出了更好的办法,我会把它贴在这里。我很感激基思!谢谢!