0

ストアド プロシージャを作成したいのですが、どのアプローチが適切なのか、また MySQL でこれが可能かどうかもわかりません。

私の問題を紹介させてください。次のような列を持つテーブルがあるとします。

TABLE A
id  | Hotel  |  city_name  |  region_name  | country
 1  |   A    |   Amsterdam | North-Holland | Netherlands
 2  |   B    |   Amsterdam | North-Holland | Netherlands
 3  |   C    |   Leiden    | North-Holland | Netherlands
 4  |   D    |   Katwijk   | North-Holland | Netherlands
 5  |   E    |   Leiden    | North-Holland | Netherlands
 6  |   F    |   Katwijk   | North-Holland | Netherlands

このクエリを実行するたびに 3 つの結果のみを取得したいので、結果を次の順序で作成する必要があります。

  1. 都市が 3 つ以上ある場合 (この場合、ユーザーはアムステルダムを選択できます)、city_name=Amsterdamアムステルダムのランダムな 3 つの都市を返します。
  2. アムステルダムのレコードが 3 つ未満の場合、アムステルダムを含むレコードのいずれかを返します + ランダム レコードを返しますが、region=North-Holland返されるレコードの合計量は常に 3 である必要があります (例: 2 つのレコードがあり、city= Amsterdam+ 1 つのランダム レコードを取得します)例 2からregion=North Holand; :レコードが 1 つあり、city=Amsterdamランダムなレコードが 2 つあり、ここでregion="north Holland")

SQLでこれを行うことは可能ですか?それとも、phpですべてのレコードを取得してから、各レコードを反復処理する必要がありますか?

おそらく、プロシージャで 2 つの引数を渡す必要があります (city_name, region )。

これまでのところ、いくつかの基本的な SQL クエリを試しましたが、うまくいきませんでした。

4

2 に答える 2

2

次のようなものを試してみてください

(SELECT *
FROM A
WHERE city_name = 'Amsterdam'
ORDER BY RAND()
LIMIT 3)

UNION

(SELECT *
FROM A
WHERE region = 'North Holand' AND city_name <> 'Amsterdam'
ORDER BY RAND()
LIMIT 3)

LIMIT 3;
于 2013-03-20T11:37:38.863 に答える
1

この論理的な部分は、主に php で行うことをお勧めします。SQL では可能ですが、SQL の論理構造は従うのが難しい傾向があり、それは PHP ではあまり問題にならないことがわかりました。

PHP でロジックを実行するには、2 つの別個のクエリが必要になる場合があります (ただし、最初に 3 つ取得できない場合のみ)。

クエリを実行して最初の 3 つを取得します ( LIMIT 3SQL で使用)。3 つの結果が得られたかどうかを確認します。そうでない場合は、取得した金額を 3 から引き、それをLIMIT2 番目のクエリの として使用して、他のランダムな結果を取得します。

于 2013-03-20T11:42:18.287 に答える