0

私はPHPにかなり慣れていませんが、何日もこれに固執しています。基本的に、私は2つのデータベースを持つ釣りのWebサイトを持っています。1つは個人的なベスト用で、もう1つはすべての時間記録用です。さて、私は、テーブルを1つだけにして、全員が個人的に最善である方が簡単だと思いました。次に、PHP/SQLスクリプトを使用してすべての時間レコードを取得できます。

問題は、魚の名前と捕獲された最大重量を取得しますが、それでも常に1人の人物を表示し、それを捕獲した正しい人物ではないことです。

テーブルは、基本的に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:

Piggyという名前のCarpのレコードは、DavidBloggsがキャッチした1024の重さです。

フリッパーという名前のコイは、アーサー・スミ​​スが捕まえた体重123です。

例2:

Piggyという名前のCarpのレコードは、DavidBloggsがキャッチした1024の重さです。

フリッパーという名前のコイは、アーサー・スミ​​スが捕まえた体重123です。

4

1 に答える 1

0

私の推測では、あなたは正しいデータを取得していると思いますがMAX(Drams)GROUP BY Nameあなたは最初のデータを取得しているのであって、PersonPersonMAX(Drams)

これがあなたがやろうとしていることを達成するための2つの異なる方法です-


この最初のものにはnestled SELECT、行をName - ASCとで並べ替えるがありDrams - DESC、外側GROUP 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)とドラム(高-低)で並べ替えられます。この整理されたテーブルは、テーブルとして一時的に保存されますa

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

2-外側SELECTはテーブルを取得aし、を実行して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

2つ目は、nestled SELECTを取得しMAX(Drams)JOINそれを最上位レコードの行にsします。

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(ドラム)を選択します。この整理されたテーブルは、テーブルとして一時的に保存されますmaxDrams

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

2-外側はテーブルをSELECT取り、元のテーブルを使用します- 。の行としての行を検索し、タイプ(AZ)とランク(低-高)で結果を並べ替えます。maxDramsJOINtabletableNameDrams==maxDrams

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 に答える