Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检索排名前三的事件_Php_Mysql_Pdo - Fatal编程技术网

Php 如何检索排名前三的事件

Php 如何检索排名前三的事件,php,mysql,pdo,Php,Mysql,Pdo,我有用户可以评分的体育赛事。所有数据都存储在Mysql数据库中 评级表: rating_id PK organization float //subrating value_for_money float //subrating fun_factor float //subrating facilities float //subrating event_id int user_id int 事件表: event_id PK event_name varchar 是否有一种方法可以使用My

我有用户可以评分的体育赛事。所有数据都存储在Mysql数据库中

评级表:

rating_id PK 
organization float //subrating
value_for_money float //subrating
fun_factor float //subrating
facilities float //subrating
event_id int
user_id int
事件表:

event_id PK
event_name varchar
是否有一种方法可以使用Mysql query连接表并对它们进行排序,以便检索子评级中平均评级最高的3个事件?

尝试以下方法:

Select 
distinct r.eventId
from 
ratingTable r
inner join eventTable  e on (r.eventId=e.eventId)
order by rating_id limit 3
但它也可以通过以下方式实现:

Select 
    distinct r.eventId
    from 
    ratingTable r
    inner join eventTable 
order by rating_id limit 3
试试这个:

Select 
distinct r.eventId
from 
ratingTable r
inner join eventTable  e on (r.eventId=e.eventId)
order by rating_id limit 3
但它也可以通过以下方式实现:

Select 
    distinct r.eventId
    from 
    ratingTable r
    inner join eventTable 
order by rating_id limit 3

我想可能是这样的:

SELECT e.event_id, event_name, avg_rating
FROM Event_table e
JOIN (
    SELECT event_id, MAX((organization+value_for_money+fun_factor+facilities)/4) avg_rating
    FROM Ratings_table
    GROUP BY event_id
    ORDER by avg_rating DESC
    LIMIT 3) r
ON e.event_id = r.event_id

我想可能是这样的:

SELECT e.event_id, event_name, avg_rating
FROM Event_table e
JOIN (
    SELECT event_id, MAX((organization+value_for_money+fun_factor+facilities)/4) avg_rating
    FROM Ratings_table
    GROUP BY event_id
    ORDER by avg_rating DESC
    LIMIT 3) r
ON e.event_id = r.event_id

这将是一个非常复杂的查询,要在一个mysql查询中完成这一切。就我个人而言,我会用PHP来做这件事。这是一个如何在PHP和MySQLi中实现的示例

$ratings = array();
$query = "SELECT * FROM ratings";
$results = $dbConn->query($query);
//First we load all results into a big array.
while($row = $results->fetch_assoc($results) {
    if(!isset($ratings[$row['rating_id']]) {
        $ratings[$row['event_id']]['count'] = 0;
    }
    $ratings[$row['event_id']]['count']++;
    $ratings[$row['event_id']]['organisation'] += $row['organisation'];
    $ratings[$row['event_id']]['value_for_money'] += $row['value_for_money'];
    $ratings[$row['event_id']]['fun_factor'] += $row['fun_factor'];
    $ratings[$row['event_id']]['facilities'] += $row['facilities'];
}
//Now we go through each event and average out the results.
$averages = array();
foreach($ratings as $event_id => $data) {
    $averages[$event_id]['organisation'] = $data['organisation'] / $data['count'];
    $averages[$event_id]['value_for_money'] = $data['value_for_money'] / $data['count'];
    $averages[$event_id]['fun_factor'] = $data['fun_factor'] / $data['count'];
    $averages[$event_id]['facilities'] = $data['facilities'] / $data['count'];
}
//Now we can sort by whatever we want to:
或者,如果您想要所有4个评级的平均值,您可以在末尾使用此位来代替平均值:

$averages = array();
foreach($ratings as $event_id => $data) {
    $averages[$event_id] = (($data['organisation'] + $data['value_for_money'] + $data['fun_factor'] + $data['facilities']) / 4) / $data['count'];
}
请注意:我尚未测试此代码。。。您应该自己检查它是否有bug。

对于排序,请检查排序多维数组上的各种堆栈溢出答案。
或者

这将是一个非常复杂的查询,要在一个mysql查询中完成这一切。就我个人而言,我会用PHP来做这件事。这是一个如何在PHP和MySQLi中实现的示例

$ratings = array();
$query = "SELECT * FROM ratings";
$results = $dbConn->query($query);
//First we load all results into a big array.
while($row = $results->fetch_assoc($results) {
    if(!isset($ratings[$row['rating_id']]) {
        $ratings[$row['event_id']]['count'] = 0;
    }
    $ratings[$row['event_id']]['count']++;
    $ratings[$row['event_id']]['organisation'] += $row['organisation'];
    $ratings[$row['event_id']]['value_for_money'] += $row['value_for_money'];
    $ratings[$row['event_id']]['fun_factor'] += $row['fun_factor'];
    $ratings[$row['event_id']]['facilities'] += $row['facilities'];
}
//Now we go through each event and average out the results.
$averages = array();
foreach($ratings as $event_id => $data) {
    $averages[$event_id]['organisation'] = $data['organisation'] / $data['count'];
    $averages[$event_id]['value_for_money'] = $data['value_for_money'] / $data['count'];
    $averages[$event_id]['fun_factor'] = $data['fun_factor'] / $data['count'];
    $averages[$event_id]['facilities'] = $data['facilities'] / $data['count'];
}
//Now we can sort by whatever we want to:
或者,如果您想要所有4个评级的平均值,您可以在末尾使用此位来代替平均值:

$averages = array();
foreach($ratings as $event_id => $data) {
    $averages[$event_id] = (($data['organisation'] + $data['value_for_money'] + $data['fun_factor'] + $data['facilities']) / 4) / $data['count'];
}
请注意:我尚未测试此代码。。。您应该自己检查它是否有bug。

对于排序,请检查排序多维数组上的各种堆栈溢出答案。
或者

您想获得3个最高评分,还是想获得3个平均评分最高的评分?我想你想要的是后者,但你的问题要求的是前者。我想通过4个次级评级的平均值来获得前3个事件。你想要的可能比在PHP中执行单个查询更容易。虽然可以在一个查询中进行查询,但查询将非常复杂。我可以如何使用PHP进行查询?我现在正在键入答案,请返回5。您希望获得3个最高评分,还是希望获得3个平均评分最高的评分?我想你想要的是后者,但你的问题要求的是前者。我想通过4个次级评级的平均值来获得前3个事件。你想要的可能比在PHP中执行单个查询更容易。虽然可以在一个查询中进行查询,但查询将非常复杂。我可以如何使用PHP进行查询?我现在正在键入答案,请在5中检查。为什么您要按id评级排序?他想要按平均等级订购。你为什么按等级订购?他想要按平均评分排序。嗯,比我想象的简单多了。嗯,比我想象的简单多了。谢谢,我感谢你的努力。谢谢,我感谢你的努力。