我正在使用PHP / MySQL处理我的第一个项目,其中我列出了某些类别(食品,购物等)中1-5的城市和评级。我想要做的是评估每一行(每个城市),提交表格是否重要。
这就是我希望它的工作方式。
说,例如:
1. 芝加哥食物:4,购物:4,夜生活:4
2. 纽约食物:4,购物:5,夜生活:5
3. 波士顿食物:5,购物:4,夜生活:3
(评级只是例如)
用户说食物并不重要。因此,该代码仅评估购物和夜生活...纽约以10结束,芝加哥结束8而波士顿结束7。
由于我有一个大约35-40个城市的列表,我想动态评估每个类别(如果用户认为它“重要”),并且获胜者将是评估结束时的最高数字。 / p>
有没有人对如何解决这个问题有任何想法?我有MySQL内置的所有评级表,只需要编写代码。
我尝试过:使用数组引入所有值,但我发现很难遍历每一行......帮助!
答案 0 :(得分: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
答案 1 :(得分: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
,利用PDO::quote()
进行转义,但用你的mysql库提供的任何引用/转义机制替换回调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查询。
这应该让你知道如何完成你想要的东西。
最重要的是:让MySQL完成所有工作(过滤,排序) - 而不是PHP。