0

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

此查询从“图像”表中提取具有特定维度的图像,并使用 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
4

1 回答 1

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

于 2012-12-03T15:07:17.197 回答