如何在循环中显示GROUP BY数据

时间:2015-10-29 12:59:15

标签: php mysql foreach

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)

2 个答案:

答案 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>
  }
}