0

これが私のシナリオです。2つの異なるテーブルがあります。テーブル「subscriptions」にはユーザーサイトへのサブスクリプションに関連するすべての情報が含まれ、「ratings」テーブルにはサブスクライブサイトの製品のスコアが含まれます。単純化は次のようなものです。

Subscriptions: 'id','user','place','created', etc.
Ratings: 'id','user','product','created',etc.

ここで、サブスクリプションまたは評価のいずれかである最新の10個のアイテムを返すためにmysqlが必要です。これまでのところ、見つかった解決策は2つの異なる呼び出しを行うことでした。

SELECT * FROM subscriptions WHERE ... ORDER BY created LIMIT 10. 

2つの結果(20要素)を使用して、「created」で多次元配列を並べ替え、(結果を$ itemsに保存して)上位10を取得します。

$items = array_slice($items, 0, 10);

このソリューションは2回の呼び出しで取得し、必要以上の要素を返すため、効率的ではないと思います。UNION演算子を使用すると、同じ列数で複数の異なるテーブルを一度に選択できることを読んでいます。私の質問は、1回の呼び出しで、共通のフィールド(私の場合は作成された)によって順序付けられたさまざまなタイプの特定の数の要素を結合する最も効率的な方法は何ですか?可能ですか?どうもありがとう、イエス様、どんな助けでもありがたいです。

4

3 に答える 3

2

UNIONが必要です。

ここでそれを使用する方法を学ぶことができます:

2つのテーブルを結合してから、日付順に並べ替えますが、両方のテーブルを組み合わせます

私が投稿したリンクでは説明されていませんが、UNIONにも制限を設けることができます。ORDER BYと組み合わせると、これが必要になります。(Frits van Campenの功績)

(SELECT cols FROM subscriptions) 
UNION 
(SELECT cols FROM ratings);
ORDER BY created LIMIT 10
于 2012-07-09T16:47:54.200 に答える
1

UNIONを使用して結果を結合するようにクエリを変更し、結果が結合されたら、LIMITメソッドとORDER BYを使用して、出力を目的のレコード数に制限できます。

ORDER BYまたはLIMITを個々のSELECTに適用するには、SELECTを囲む括弧内に句を配置します。

加えて:

ORDER BYまたはLIMIT句を使用してUNION結果全体をソートまたは制限するには、個々のSELECTステートメントを括弧で囲み、最後のステートメントの後にORDERBYまたはLIMITを配置します。

(SELECT cols FROM subscriptions WHERE ... ORDER BY created LIMIT 10) 
UNION 
(SELECT cols FROM ratings WHERE ... ORDER BY created LIMIT 10);
ORDER BY created LIMIT 10
于 2012-07-09T16:48:41.760 に答える
1

使用UNIONhttp ://dev.mysql.com/doc/refman/5.0/en/union.html

于 2012-07-09T16:48:48.273 に答える