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 查询。

这应该让你知道如何去完成你想要的。

最重要的是:让 MySQL 完成所有工作(过滤、排序)——而不是 PHP。

于 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 回答