使用GROUP by的PHP(SQL)脚本无法正确显示某些字段
我对PHP相当陌生,但已经在这方面停留了好几天。基本上,我有一个钓鱼网站,有两个数据库。一个是个人最好成绩,一个是所有时间记录。现在,我认为只有一个表会更简单,每个人都有自己的最佳记录,然后我可以使用PHP/SQL脚本检索所有时间记录 问题是,它检索鱼的名称和捕获的最高重量,但始终显示一个人,而不是捕获它的正确的人 表中包含的字段基本上类似于物种、鱼名、等级、重量(Drams)、垂钓者、Peg、DateCapture 剧本是使用GROUP by的PHP(SQL)脚本无法正确显示某些字段,php,sql,Php,Sql,我对PHP相当陌生,但已经在这方面停留了好几天。基本上,我有一个钓鱼网站,有两个数据库。一个是个人最好成绩,一个是所有时间记录。现在,我认为只有一个表会更简单,每个人都有自己的最佳记录,然后我可以使用PHP/SQL脚本检索所有时间记录 问题是,它检索鱼的名称和捕获的最高重量,但始终显示一个人,而不是捕获它的正确的人 表中包含的字段基本上类似于物种、鱼名、等级、重量(Drams)、垂钓者、Peg、DateCapture 剧本是 $query = "SELECT Type, Name, Rank,
$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);
$query=“按名称顺序按类型ASC、等级ASC从表组中选择类型、名称、等级、人员、最大值(DRAM)作为DRAM”;
$result=mysql\u query($query)或die(mysql\u error());
echo“测试PB表中所有时间记录的显示。
”;
while($row=mysql\u fetch\u数组($result)){
echo“名为“$row['name']”的“$row['Type']”记录的重量为“$row['Drams']”。被“$row['Person']”捕获;
回声“
”;
}
mysql_close($con);
应该发生的是,现在将生成一个列表,显示鱼的每个名称和捕获的重量,以及谁捕获了鱼,如示例1所示,但示例2正在发生
例1:
David Bloggs捕获的名为Piggy的鲤鱼记录为1024磅
Arthur Smith捕获的名为鳍状肢的鲤鱼重123磅
例2:
David Bloggs捕获的名为Piggy的鲤鱼记录为1024磅
Arthur Smith捕获的名为鳍状肢的鲤鱼重123我猜你得到的是正确的
MAX(Drams)
,但在名为的组中,你得到的是第一个人
数据,而不是拥有MAX(Drams)
这里有两种不同的方法来完成你想要做的事情-
第一个有一个嵌套的SELECT
,它按Name-ASC
和Drams-DESC
对您的行进行重新排序,外部按名称进行分组
,以获得最高记录
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
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
首先运行,并按名称(A-Z)和DRAM(高低)对表行重新排序。然后,这个组织好的表被临时存储为表a
(SELECT Type, Name, Rank, Person, Drams FROM table ORDER BY Name, Drams DESC) a
(SELECT Name, MAX(Drams) AS Drams FROM table GROUP BY Name) maxDrams
2-外部选择
现在取表a
,执行按名称分组
,给我们每个鱼名的第一个(或顶部/最高)记录,并按类型(a-Z)和等级(低-高)排序结果
第二个有一个嵌套的选择,它获取MAX(Drams)
,然后将其加入到具有顶部记录的行中
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
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
首先运行,并选择每条鱼的名称(通过groupby Name
)及其最大值(DRAM)。然后,这个组织好的表被临时存储为tablemaxDrams
(SELECT Type, Name, Rank, Person, Drams FROM table ORDER BY Name, Drams DESC) a
(SELECT Name, MAX(Drams) AS Drams FROM table GROUP BY Name) maxDrams
2-外部选择
现在获取表格maxDrams
,并与原始表格表格
进行连接。它在表
中找到名称
和=
为maxDrams
中的行,并按类型(A-Z)和等级(低-高)对结果排序
你可以在-,看到一个例子。这显示了两个先执行嵌套的查询,然后执行整个查询的示例。希望这能让它更清楚一点。请注意,mysql\u xxx()
函数被认为是过时和不安全的。建议使用mysqli_xx()
函数或PDO库。另请参见示例1和示例2,它们是相同的。你能用你想要的输出编辑示例1吗?谢谢你,肖恩。第一个工作得很好。无法使第二条消息生效-消息类似于派生的表等。。。你介意向我解释一下这个代码是如何工作的吗?首先执行哪一部分,括号还是开始?我为每个查询添加了一些解释,并链接到一个SQLFIDLE,其中显示了两个查询的示例。希望这有帮助。