我目前正在尝试创建一个MySQL查询,它使用静态顺序从特定表(图像)输出数据。我目前正在使用UNION ALL这样做,但我现在有点卡住了。
这就是我想要它做的事情:
我有一个名为 images 的表,其中包含以下字段:user_id,image,image_dimension(此字段值:小,宽,高,大)。
从图像表中,我想以静态顺序检索具有特定尺寸的图像,以使这些图像适合我的静态图像网格。现在它变得复杂了:我每个user_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”中提取具有特定维度的图像,并使用LIMIT - 我获得订单所需的金额。到目前为止,这是有效的,但它不允许我在保持订单的同时每个user_id只获取一个图像。
如何确保获得订单(请参阅查询),但每个user_id只能获得一张图片?
再次订购:1x大,2x小,1x大,1x宽,2x小,2x高和1x大)
抱歉我的英文不好,如果您需要进一步说明,请与我联系。
修改
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
答案 0 :(得分:0)
我在这种情况下尚未测试的一种方法,但想法是正确的,就是在数据库中构建一个包含图像排列的辅助表,如下所示:
----- --------
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
变量递增并为查询的users
表的每一行设置,然后可以通过它们与arrangement
表中的条目配对订购号码,用于配对用户,图像大小及其在排列中的顺序。一旦你这样做,你可以将它们与图像匹配。 (Ab)使用GROUP BY
(而不是ORDER BY
)使用某些特定于MySQL的行为,可以消除用户可能具有的相同大小的任何图像,并通过某种任意方法有效地选择其中一个。
这种方法远非理想,特别是因为它滥用了一些特定于MySQL的行为,尽管可能通过相关子查询消除了这种滥用。但是,它可能会给你一些关于如何解决问题的想法。
那就是说,这种事情并不完全是你用SQL做的事情。