2

table から 10 個のレコードを取得するために、次のような SQL (MySQL SQL) ステートメントがありますbar

SET @foo:=1;
SELECT DISTINCT
    @start:=ROUND(RAND()*100),
    @start+ROUND(RAND()*100)+1,
    CONCAT("id-",@foo:=@foo+1)
FROM
    bar
LIMIT 10

次のようなユニークな要素を生成します。

...
14   72   id-2
...
9    10   id-8
...

ここまでは順調ですね。しかし、私が本当にやりたいのは、最初または最初と 2 番目の列の値のみの一意性に基づいて、DISTINCT重複が追加されないようにキーワードを使用することです。

たとえば、現在、レコードid-nごとに要素が常に異なるため、10 レコードすべてが一意です。したがって、これは可能です:

...
9    10   id-4
...
9    10   id-8
...

私がやりたいことは、2 番目の9 10 id-8要素が結果セットに含まれないようにすることです (または、代わりに、9 10 id-4どの重複が除外されてもかまいません)。DISTINCT最初または最初と2番目の列に制約する方法はありますか?

id-nSQL ステートメントから値を除外し、それを追加するダウンストリーム スクリプトで結果を後処理できることはわかっています。しかし、好奇心から、SQL クエリ内に含まれるソリューションを見つけたいと思います。ありがとう!

4

1 に答える 1

1

まあ、これがあなたがやろうとしていることだと100%確信しているわけではありませんが、クエリの結果をサブクエリMAXに入れて、最後のレコードを取得するために使用できるようです。

多分このようなもの:

SELECT rand1col, rand2col, CONCAT("id-",Max(fooidcol)) as col3
FROM 
(
    SELECT DISTINCT
        @start:=ROUND(RAND()*100) as rand1col,
        @start+ROUND(RAND()*100)+1 as rand2col, 
        @foo:=@foo+1  as fooidcol
    FROM bar
) t
GROUP BY rand1col, rand2col
LIMIT 10

これをテストする際の問題は、テストRAND()に必要なものが返されないため、それを実行しようとする実際の列を使用してこのSQL Fiddleを作成しましたが、上記のクエリでも機能するようです。

そして、ここに上記のクエリのフィドルがあります-時々動作しますが、更新を続けてください。

于 2013-01-17T00:40:09.887 に答える