1

動的SQLとinc()関数を調べましたが、どちらも実際には私が求めているものではありません。

次のようなデータベースがあるとします。

grade     name      age
9         Bob       9
10        Sue       11
11        Larry     15
9         Joe       8
10        Carrot    10

最初に最低グレード(9)のすべての行を選択し、次に最も古い行を表示するテーブルを作成したいと思います。次に、次に高いグレード(10)を検索して、最も古いグレードを表示します。次に、次に高いグレード(11)に移動し、最も古いものを表示します。

それらすべてが同じテーブルにあり、グレードごとに個別のSQL呼び出しと異なるPHP変数を書き出す必要がないようにしたいと思います。

これは私が今持っているSQL呼び出しです:

$query = "SELECT * FROM horses WHERE grade='1' ORDER BY points DESC LIMIT 1" or die(mysql_error());

データベース内の最大数に達するまでグレード列をインクリメントする方法はありますか?

提案をありがとう。

4

1 に答える 1

2

私があなたの要求を理解しているなら、あなたはこれのためにループを必要としません。MAX()代わりに、でグループ化された集計が必要ですgrade。次の方法は、RDBMSとは独立して機能するはずです。これは、ペアを取得するために最大のperをJOIN返すサブクエリに対してに依存し、それをメインテーブルに対して結合して(および必要に応じて他の列を)取得します。agegroupage/groupname

SELECT
  horses.grade, 
  horses.name, 
  horses.age
FROM
  horses
  JOIN (
    SELECT grade, MAX(age) as maxage
    FROM horses 
    GROUP BY grade
  ) ma ON horses.grade = ma.grade AND horses.age = ma.maxage
ORDER BY grade ASC

これがSQLFiddle.comの例です

戻り値:

GRADE NAME  AGE
9     Bob    9
10    Sue    11
11    Larry  15

一般に、ループ内で複数のクエリを実行する代わりに1つのクエリを実行する方がはるかに高速で、リソースを大量に消費しないため、可能な限りこれを使用する必要があります。

于 2012-12-06T00:35:29.237 に答える