0

我对 PHP 相当陌生,但已经坚持了好几天。基本上,我有一个钓鱼网站,它有两个数据库。一个是个人最好成绩,一个是所有时间记录。现在,我认为只有一张表会更简单,每个人都最好,然后我可以使用 PHP/SQL 脚本来检索所有时间记录。

问题是,它检索了鱼的名称和捕获的最大重量,但始终显示一个人,而不是捕获它的正确人。

表由基本上像 Species、FishName、Rank、Weight (Drams)、Angler、Peg、DateCaught 等字段组成。

脚本是

$query = "SELECT Type, Name, Rank, Person, MAX(Drams) as Drams FROM table GROUP BY Name  ORDER BY Type ASC, Rank ASC"; 

$result = mysql_query($query) or die(mysql_error());
echo "<b>Testing a display of All Time Records from PB Table.</b> <br>";

while($row = mysql_fetch_array($result)){
echo "Records for ". $row['Type']. " with name ". $row['Name']. " weighs ". $row['Drams']. " caught by ". $row['Person'];
echo "<br>";
}
mysql_close($con);

应该发生的是现在将生成一个列表,其中显示一条鱼的每个名称和它们被捕获的重量,以及谁像示例 1 中那样捕获了它,但示例 2 正在发生。

示例 1:

David Bloggs 捕获的名为 Piggy 的鲤鱼的记录重达 1024

亚瑟·史密斯(Arthur Smith)捕获的重达 123 的名为 Flipper 的鲤鱼

示例 2:

David Bloggs 捕获的名为 Piggy 的鲤鱼的记录重达 1024

亚瑟·史密斯(Arthur Smith)捕获的重达 123 的名为 Flipper 的鲤鱼

4

1 回答 1

0

我的猜测是你得到的是正确的MAX(Drams),但是GROUP BY Name你得到的是第一个Person数据而不是Person那个MAX(Drams)

这里有两种不同的方法来完成你想要做的事情-


这第一个有 a ,它通过andnestled SELECT重新排列你的行,外面做的是获得最高记录Name - ASCDrams - DESCGROUP BY Name

SELECT Type, Name, Rank, Person, Drams 
FROM (SELECT Type, Name, Rank, Person, Drams FROM table ORDER BY Name, Drams DESC) a
GROUP BY Name 
ORDER BY Type ASC, Rank ASC

这是它的工作原理 -
1- 嵌套SELECT首先运行,并按名称 (AZ) 和 Drams (High-Low) 重新排序表行。然后将这个有组织的表临时存储为 table a

(SELECT Type, Name, Rank, Person, Drams FROM table ORDER BY Name, Drams DESC) a

2- 外部SELECT现在获取 tablea并执行GROUP BY Name,为我们提供每个鱼名的第一个(或顶部/最高)记录,并按类型(AZ)和排名(低-高)对结果进行排序。

SELECT Type, Name, Rank, Person, Drams 
FROM  a  /* table a was set in step 1 */
GROUP BY Name 
ORDER BY Type ASC, Rank ASC

第二个有 a nestled SELECT,它获取MAX(Drams),然后JOIN将其发送到具有最高记录的行

SELECT table.Type, table.Name, table.Rank, table.Person, table.Drams
FROM table
JOIN ( SELECT Name, MAX(Drams) AS Drams FROM table GROUP BY Name) maxDrams
ON table.Name = maxDrams.Name 
AND table.Drams = maxDrams.Drams
ORDER BY Type ASC, Rank ASC

这是它的工作原理 -
1- 嵌套SELECT首先运行,并选择每个鱼名(通过GROUP BY Name)及其 MAX(Drams)。然后将这个有组织的表临时存储为 table maxDrams

(SELECT Name, MAX(Drams) AS Drams FROM table GROUP BY Name) maxDrams

2-现在外面SELECT拿桌子maxDrams,和JOIN原来的桌子做一个- table。它找到 中的行tableNameDrams==maxDrams,并按类型(AZ)和排名(低-高)对结果进行排序。

SELECT table.Type, table.Name, table.Rank, table.Person, table.Drams
FROM table
JOIN maxDrams  /* table maxDrams was set in step 1 */
ON table.Name = maxDrams.Name 
AND table.Drams = maxDrams.Drams
ORDER BY Type ASC, Rank ASC

您可以在 - http://sqlfiddle.com/#!2/b6b66/7看到一个示例。这显示了两个示例,其中nestled首先执行查询,然后执行整个查询。希望这使它更清楚一点。

于 2012-12-04T19:31:50.057 回答