0

私は現在、静的な順序を使用して特定のテーブル(画像)からデータを出力するMySQLクエリを作成しようとしています。私は現在UNIONALLを使用してこれを行っていますが、今はちょっと行き詰まっています。

これが私がしたいことです:

次のフィールドを持つimagesという名前のテーブルがあります:user_id、image、image_dimension(このフィールドの値:small、wide、tall、large)。

画像テーブルから、静的な順序で特定の寸法の画像を取得して、静的な画像グリッドに合わせたいと思います。今では複雑になっています。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ごとに1つの画像しか取得できません。

注文を確実に取得するには(クエリを参照)、user_idごとに1つの画像しか取得できないようにするにはどうすればよいですか?

再度注文する場合: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

この状況でまだテストしていませんが、アイデアは正しい方法の 1 つは、次のように画像の配置を含むヘルパー テーブルをデータベースに作成することです。

----- --------
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それができたら、それらを画像と一致させることができます。GROUP BYMySQL 固有の動作で(ではなく) を (アブ) 使用ORDER BYすると、ユーザーが持っている可能性のある同じサイズの画像が削除され、任意の方法でそれらの画像の 1 つが効果的に選択されます。

この方法は、特に MySQL 固有の動作を悪用するため、理想とはほど遠いものですが、その悪用は相関サブクエリで排除できる可能性があります。ただし、少なくとも問題を解決する方法については、いくつかのアイデアが得られる場合があります。

とはいえ、この種のことは、SQL で行うようなことではありません。

于 2012-12-03T15:07:17.197 に答える