SQL:通过以特定(静态)顺序选择查询来检索数据的问题

时间:2012-12-03 12:39:47

标签: mysql select

我目前正在尝试创建一个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

1 个答案:

答案 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做的事情。