2

つまりね。私は3つのテーブルを持っており、次のクエリを実行しています。

select t.nomefile, t.tipo_nome, t.ordine
from
(select nomefile, tipo_nome, categorie.ordine
from t_gallerie_immagini_new as immagini
join t_gallerie_new as collezioni on collezioni.id=immagini.id_ref
join t_gallerie_tipi as categorie on collezioni.type=categorie.id
order by RAND()
) as t
group by t.tipo_nome
order by t.ordine

これは、すべて関係1-Nの3つのテーブルに適用されます。これらのテーブルは、結合してから、上位レベルのテーブルのそれぞれの異なる結果から1つのランダムな結果を取得する必要があります。このクエリは問題なく機能します。問題は、1つのSELECTのみを使用してこのクエリを書き直すように求められていることです。1つの選択だけでこれを行う別の方法があります。SQLsintaxによると、GROUPBYはORDERBYの前にある必要があるため、それぞれの最初のレコードしかない場合は、ランダムに並べ替えても意味がありません。上位レベルのテーブルの値。

誰かが1つの選択だけを使用してこのクエリを書く方法についての手がかりを持っていますか?

4

2 に答える 2

2

一般に、私があまり誤解していない場合、ORDER BYこのようなクエリのサブクエリの句は、指定された順序に従って(外部クエリの)非GROUPBY列をプルできるようにする手法と関係があります。そして、それはサブクエリがこのクエリにとって重要であることを意味するので、ここでは運が悪いかもしれません。

この特定のケースでは、選択された順序はBY RAND()特定の列/列のセットではなく、次のように同じレベルで結合とグループ化の両方を実行することで、非常に大まかな同等のものになる可能性があります。

select nomefile, tipo_nome, categorie.ordine
from t_gallerie_immagini_new as immagini
join t_gallerie_new as collezioni on collezioni.id=immagini.id_ref
join t_gallerie_tipi as categorie on collezioni.type=categorie.id
group by tipo_nome
order by categorie.ordine

ただし、これが完全に同等ではない理由を理解する必要があります。つまり、MySQLではGROUPBYクエリで非GROUPBY列をプルできますが、それらがGROUP BY列に関連付けられていない場合、返される値は...いいえ、ランダムではなく、使用される用語です。マニュアルによると不確定です。一方、最初の段落で説明した手法は、グループ化の前に行セットが明示的かつ明確に順序付けられている場合、非GROUPBY列の値は常に同じ*になるという事実を利用しています。したがって、不確定性は、「通常の」行がグループ化の前に明示的に順序付けられていないという事実と関係があります。

今、あなたはおそらく違いを見ることができます。元のバージョンでは、行が明示的に順序付けられています。たとえそうだBY RAND()としても、ほとんどの場合、出力で(可能な限り)異なる結果が得られるようにするために、意図的にそうしています。ただし、変更されたバージョンでは明示的な順序が「奪われ」ているため、「ランダム」なものであっても、連続して多くの実行で同じ結果が得られる可能性があります。

したがって、一般的に、上記の理由で問題は解決できないと思います。提案された修正バージョンのようなものを使用する場合は、元のバージョンとは少し異なる動作をする可能性があることに注意してください。

*ちなみに、この手法は十分に文書化されていない可能性があり、マニュアルに従うよりも経験的に発見されている可能性があります。

于 2012-05-22T10:20:05.730 に答える
1

このクエリを書き直したリクエストの背後にある理由を理解できませんでしたが、「select」という単語を1回だけ使用する解決策があることがわかりました。クエリは次のとおりです。

SELECT g.type, SUBSTRING_INDEX(GROUP_CONCAT(
i.nomefile ORDER BY
RAND()),',',1) nomefile
FROM t_gallerie_new g JOIN t_gallerie_immagini_new i ON g.id=i.id_ref
GROUP BY g.type;

この質問に興味のある人のために。

注:GROUP_CONCATの使用には、いくつかの欠点があります。中規模/大規模のテーブルを使用する場合は、サーバー側のペイロードが増える可能性があるため、このキーワードの使用はお勧めしません。また、GROUP_CONTACTによって返される文字列のサイズには制限があり、デフォルトでは1024であるため、この命令からより大きな文字列を受信できるように、mySqlサーバーのパラメーターを変更する必要があります。

于 2012-05-25T12:06:52.973 に答える