2017-06-01 14 views
-2

からAAセット数を取得するには:MySQLのクエリ私はテーブルを持っている場合は、各グループ

------------------ 
| Provider | ID | 
------------------ 
| X  | 125 | 
------------------ 
| X  | 133 | 
------------------ 
| X  | 342 | 
------------------ 
| X  | 327 | 
------------------ 
| Y  | 123 | 
------------------ 
| Y  | 853 | 
------------------ 
| Y  | 123 | 
------------------ 
| Z  | 853 | 
------------------ 
| Z  | 533 | 
------------------ 
| Z  | 174 | 
------------------ 

私は

を生成するプロバイダのXとY(Zを無視して)のそれぞれから2つのランダムエントリを取得したいです
X id 
X id 
Y id 
Y id 

私は

select id, provider from tableName a where (SELECT COUNT(*) FROM tableName b where b.provider = a.provider) = 2; 

任意のアイデアを含むいくつかのクエリを試してみましたか?

答えて

1

rand()で、xとyのwhere句で2に制限し、すべての結果を結合します。あなたがやろうとしていること、そして維持しやすいことははっきりと明白です。

SELECT Provider, ID 
FROM tableName 
WHERE provider = 'X' 
ORDER BY Rand() 
LIMIT 2 

UNION ALL 

SELECT Provider, ID 
FROM tableName 
WHERE provider = 'Y' 
ORDER BY Rand() 
LIMIT 2 
1

どの程度このクエリを試してみてください。

select provider, ID, Rank from 
(
    select *, @row_num := IF(@prev_value=provider,@row_num+1,1) AS rank, @prev_value := provider from 
    (
     select provider, ID, rand() as SortingField from yourTable 
     order by provider, SortingField 
    ) t1, 
    (SELECT @rownum := 0) x, (SELECT @prev_value := '') y 
) src 
where Rank <= 2 and Provider <> 'Z' 

わかりましたので、ここではそれがどのように動作するかです。まず最初に、ランダムなエントリが必要なので、mySqlのrand()関数を使って行った "ランダムな"ソートフィールドを追加する必要があります。乱数を与えるので、フィールドは常にランダムにソートされます。

これは、2つのランダムなエントリである要件の次のビットを設定します。あなたのフィールドはランダムにソートされているので、クエリが実行されるたびに異なる最初の2つのレコードを選択します。これを行うには、必要なフィールドが値を変更するたびにリセットされるラインカウンタが必要になります(あなたの場合はプロバイダです)。これは変数を使用して行われていることです:

@rownumは行カウンタで、新しいレコードが表示されるたびに1ずつインクリメントされます。

@prev_valueは、カウンターをリセットする必要があるかどうかを判断するために使用するバリューチェッカーです。 @row_numのインクリメント後に設定されていることに注意してください。これは、前に設定した場合、現在の値と照合しているため意味がありません。

最後に、必要なフィールド(プロバイダ、ID、ランク)を選択し、2より劣っているランクを取得し、クエリの最後の部分が行う「Z」プロバイダを無視するだけです。

ご不明な点がございましたら、お気軽にお問い合わせください。

関連する問題