Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
使用GROUP by的PHP(SQL)脚本无法正确显示某些字段_Php_Sql - Fatal编程技术网

使用GROUP by的PHP(SQL)脚本无法正确显示某些字段

使用GROUP by的PHP(SQL)脚本无法正确显示某些字段,php,sql,Php,Sql,我对PHP相当陌生,但已经在这方面停留了好几天。基本上,我有一个钓鱼网站,有两个数据库。一个是个人最好成绩,一个是所有时间记录。现在,我认为只有一个表会更简单,每个人都有自己的最佳记录,然后我可以使用PHP/SQL脚本检索所有时间记录 问题是,它检索鱼的名称和捕获的最高重量,但始终显示一个人,而不是捕获它的正确的人 表中包含的字段基本上类似于物种、鱼名、等级、重量(Drams)、垂钓者、Peg、DateCapture 剧本是 $query = "SELECT Type, Name, Rank,

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

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

表中包含的字段基本上类似于物种、鱼名、等级、重量(Drams)、垂钓者、Peg、DateCapture

剧本是

$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)。然后,这个组织好的表被临时存储为table
maxDrams

(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,其中显示了两个查询的示例。希望这有帮助。