MySQL表:图像
id | Rating |
1 | 3.0 |
2 | 3.2 |
3 | 4.7 |
4 | 2.4 |
5 | 2.4 |
6 | 4.3 |
7 | 2.4 |
8 | 3.2 |
我基本上试图查询上面的表格以获取这两个字段(id和评级)中的数据,以便我可以生成一个月份的图像'页。 我可以这样查询数据库:
$rows = @mysql_rows('SELECT ID FROM Image WHERE Live = 1 AND '.$whereDateLive.' ORDER BY Rating Desc LIMIT 15');
它给了我所有图像的ID。然后我使用foreach循环从最高评级的降序开始构建我的图像列表,类似于 -
foreach($rows as $row)
{
$img = new Image($row['ID'],true);
$content .= '<img src="/images/'.$img.'.jpg">';
}
这给了我一个没有排序的基本列表(例如第一名,第二名等)。我想要做的是通过评级对ID进行分组,因为从表中可以看出,图像ID 2&amp; 8具有相同的评级(3.2)因此将是联合第三名。我理论上可以用以下方法做到这一点:
$rows = @mysql_rows('SELECT ID FROM Image WHERE Live = 1 AND '.$whereDateLive.' GROUP BY Rating ORDER BY Rating Desc LIMIT 15');
它为我提供了我需要的数据,但是,foreach循环只显示该组的1个图像(组中的第一个),因此显然不适合使用。我想知道的是有一个PHP函数会根据它的分组方式显示数据吗?或者我的代码有问题。谢谢。
我想要的结果是(按照下面的要求) -
Image of the Month Page Title
------------------------------
First Place
[imgid 3]
-----------
Second Place
[imgid 6]
-----------
Third Place
[imgid 2] [imgid 8]
----------
Best of the rest
(showing any image with a rating > 2.4)
答案 0 :(得分:2)
我刚检查了这个并且它没有错误,但有些东西告诉我内部连接中的ORDER和LIMIT似乎不太好。但你可以尝试一下(SQL Fiddle有限制5来保持简短)。另请注意,您必须相应地调整PHP
变量。
SELECT aa.id, aa.rating
FROM Image AS aa
INNER JOIN (
SELECT rating
FROM Image
GROUP BY rating
ORDER BY rating DESC
LIMIT 15
) AS _aa
ON aa.rating = _aa.rating
ORDER BY aa.rating DESC
LIMIT 15
答案 1 :(得分:2)
从表中选择ID和评级。按评级排序,以便首先获得最佳评分图像。
$rows = @mysql_rows
('select id, rating from image where live = 1 and '.$whereDateLive.' order by rating');
然后在PHP中使用一个循环来考虑评级。在伪代码中:
$rating = -1;
$position = 0;
foreach($rows as $row)
{
$img = new Image($row['id'], true);
if(($row['rating'] = $rating) or $position > 3 then
{
<show the image next to the one before>
}
else
{
++$position;
$rating = $row['rating'];
<show the title "n.th place" according to $position>
<show the image>
}
}