2

PHP/MySQL を使用して、都市のリストと特定のカテゴリ (食品、ショッピングなど) の 1 から 5 までの評価がある最初のプロジェクトに取り組んでいます。私がやりたいことは、カテゴリが重要かどうかについてフォームが送信されたときに、各行 (各都市) を評価することです。

これが私がそれを機能させたい方法です。

たとえば、
1.シカゴの食べ物: 4、ショッピング: 4、ナイトライフ: 4
2.ニューヨークの食べ物: 4、ショッピング: 5、ナイトライフ: 5
3.ボストンの食べ物: 5、ショッピング: 4、ナイトライフ: 3
(評価は一例です)

そして、ユーザーは食べ物は重要ではないと言います。したがって、コードはショッピングとナイトライフのみを評価します... ニューヨークは 10 で終わり、シカゴは 8 で終わり、ボストンは 7 で終わります。

各カテゴリで動的に評価したい約35〜40の都市のリストがあり(ユーザーが「重要」と判断した場合)、評価の最後に勝者が最大数になります。

これをどのように行うかについて誰かアイデアがありますか?すべての評価を含むテーブルを MySQL に組み込みました。今すぐコードを書き出す必要があります。

私が試したこと:配列を使用してすべての値を取り込みましたが、各行をループするのが難しいことがわかりました...助けてください!

4

2 に答える 2

1

これに似たデータベース テーブルを想定します (少なくとも、この方法で正規化する必要があります)。

city ( id, name );
category ( id, name );
rating ( city_id, category_id, rating );

...これに似た関心の配列を持つ:

$interests = array(
    'Food',
    'Shopping'
);

...次のSQL:

$sql = 'SELECT
          city.name as city,
          GROUP_CONCAT( category.name || ": " || rating.rating, ", " ) as ratings,
          SUM( rating.rating ) as totalRating
        FROM
          rating
        JOIN
          city
          ON city.id = rating.city_id
        JOIN
          category
          ON category.id = rating.category_id
        WHERE
          category.name IN( ' . implode( ',', array_map( array( $db, 'quote' ), $interests ) ) . ' )
        GROUP BY
          city.name
        ORDER BY
          totalRating DESC';

PDO(ここではエスケープに利用する の使用を想定しましたが、mysql ライブラリが提供する引用/エスケープメカニズムでPDO::quote()コールバックを置き換えます)array( $db, 'quote' )

... これに似た結果セットが得られます (この例では、ランダムな評価データを入力しました):

array (
  0 => array (
    'name' => 'Chicago',
    'ratings' => 'Food: 3, Shopping: 3',
    'totalRating' => '6'
  ),
  1 => array (
    'name' => 'New York',
    'ratings' => 'Food: 1, Shopping: 4',
    'totalRating' => '5'
  ),
  2 => array (
    'name' => 'Seattle',
    'ratings' => 'Food: 4, Shopping: 1',
    'totalRating' => '5'
  ),
  3 => array (
    'name' => 'Los Angeles',
    'ratings' => 'Food: 2, Shopping: 2',
    'totalRating' => '4'
  ),
  4 => array (
    'name' => 'Boston',
    'ratings' => 'Food: 1, Shopping: 2',
    'totalRating' => '3'
  ),
  5 => array (
    'name' => 'San Francisco',
    'ratings' => 'Food: 1, Shopping: 1',
    'totalRating' => '2'
  )
)

最初の結果のみが必要な場合はLIMIT 1、SQL クエリに追加します。

これにより、目的を達成する方法についてのアイデアが得られるはずです。

何よりも、PHP ではなく、MySQL にすべての作業 (フィルタリング、ソート) を任せてください。

于 2012-11-20T08:52:25.893 に答える
1

このタスクは、ほんの少しの PHP コードと適切な SQL ステートメントで実行できます。
考えられる解決策は次のとおりです。

$important_cat = $_POST['categories']; //which is an array
$sql = "SELECT city, sum(".implode(' + ',$important_cat).") AS cat
        FROM tbl
        ORDER BY cat DESC";
//query sql
于 2012-11-20T07:41:37.277 に答える