これに似たデータベース テーブルを想定します (少なくとも、この方法で正規化する必要があります)。
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 にすべての作業 (フィルタリング、ソート) を任せてください。