3

イベントのデータベースを検索するために実行しているクエリに問題があります。目的はスポーツに関するもので、構造は次のとおりです。

id_event  event_sport   event_city
   1          10           153
   2          12           270
   3          09           135

テーブルスポーツは次のようなものです:

sport_id     sport_name
   1         Basketball

テーブル都市は次のとおりです。

city_id     city_name
   1         NYC

私のイベントテーブルは次のようになっているため、物事は複雑になります。

id_event  event_sport   event_city
   1         10,12       153,270
   2         7,14        135,271
   3         8,12        143,80

また、複数入力の検索フォームを用意して、複数のスポーツや複数の都市のイベントを検索できるようにしています。私は選ばれたを使用しています

Chosen からの検索結果は、たとえば次のようになります。

City = 153,270 (if user selected more than one city)
Sport = 12 (if user only selected one sport, can be "9,15")

したがって、ユーザーが複数の値を入力しなかった場合、1 つの値のみを検索できる場合があることを知って、カンマで区切られた同じ列の都市とスポーツの複数の値を検索する必要があります。

私の現在のクエリは次のとおりです。

SELECT * FROM events e
LEFT JOIN cities c ON e.event_city=c.city_id
LEFT JOIN sports s ON e.event_sport=s.sport_id
WHERE FIND_IN_SET('1CITY', e.event_city) AND FIND_IN_SET('1SPORT', e.event_sport)
;

1 つの都市を検索するのは良いことですが、ユーザーが 2 つ以上の都市を検索すると、それを表示する方法がありません。

手伝ってくれませんか?

前もって感謝します。

4

1 に答える 1

7

ユーザーが複数の都市やスポーツを入力する場合、カンマで区切ると、クエリは次のようになります。

SELECT * FROM events e
LEFT JOIN cities c on e.event_city = c.city_id
LEFT JOIN sports s ON e.event_sport = s.sport_id
WHERE (FIND_IN_SET('$city[0]', e.event_city) OR FIND_IN_SET('$city[1]', e.event_city) OR ...)
AND (FIND_IN_SET('$sport[0]', e.event_sport) OR FIND_IN_SET('$sport[1]', e.event_sport) OR ...)

ORPHP を使用すると、これらの式を次のように構築できます。

$city_list = implode(' OR ', array_map(function($x) { return "FIND_IN_SET('$x', e.event_city)"; }, explode(',', $_POST['cities'])));

$sport_list を作成するために同じことを行うと、SQL 文字列には次のものが含まれます。

WHERE ($city_list) AND ($sport_list)

ご覧のとおり、これは非常に複雑で非効率的です。コメントで提案されているように、スキーマを正規化することをお勧めします。

于 2013-06-28T00:54:38.787 に答える