PHPとMySQLでサイトを制作しています。

例えば下記のテーブルのデータがあるとした場合、

テーブルA
フィールド1(日付) | フィールド2(属性) | フィールド3(商品名)
2006/07/17 | 属性2 | 名前1
2006/07/16 | 属性1 | 名前2
2006/07/10 | 属性3 | 名前3
2006/07/14 | 属性1 | 名前4
2006/07/13 | 属性2 | 名前5

というデータがあった場合に、下記のように表示されるようにしたいのですが、どういう風にSQL文を記述するのが一番良いのか悩んでいます。

表示画面
2006/07/17 | 属性2 | 名前1
2006/07/13 | 属性2 | 名前5
2006/07/16 | 属性1 | 名前2
2006/07/14 | 属性1 | 名前4
2006/07/10 | 属性3 | 名前3

まず、日付の新しい順に表示したいのですが、そのまま新しい順にすると属性がバラバラの位置で表示されてしまうので、属性ごとにまとめて表示させててかつその各属性の新しいデータごとで比較して日付の新しいグループ順に表示させたいのです。
うまく言えないのですが、上記の表をみて分って頂けた方は、記述方法なども詳しく教えてください。

回答の条件
  • 1人10回まで
  • 登録:2006/07/17 21:42:02
  • 終了:2006/07/20 13:09:49

回答(4件)

id:birdie-brain No.1

birdie-brain回答回数40ベストアンサー獲得回数42006/07/17 22:27:45

ポイント23pt

使用するMySQLのバージョンに関する記述がないのでアレなのですが、サブクエリをサポートしているMySQL 4.1以降なら、以下のSQLクエリでどうでしょうか?

まず属性(フィールド2)ごとの最新の日付をサブクエリで求めて、これ(テーブルB)を元のテーブル(テーブルA)に結合します。

そうしておいて、属性ごとの最新日付(降順)、属性(異なる属性の最新日付が重なった場合の対策)、行ごとの日付(降順)の順でソートすれば、期待どおりの並び順で表示できるのではないでしょうか。

SELECT

  テーブルA.*

FROM

  テーブルA

  INNER JOIN (

    SELECT

      MAX(フィールド1) AS フィールド1,

      フィールド2

    FROM

      テーブルA

    GROUP BY

      フィールド2

  ) AS テーブルB ON

    ( テーブルA.フィールド2 = テーブルB.フィールド2 )

ORDER BY

  テーブルB.フィールド1 DESC,

  テーブルB.フィールド2,

  テーブルA.フィールド1 DESC

 

id:black_kenchan

すいません。元のテーブルBがどうしてもわかりません。

詳しく教えていただけるとありがたいです。

2006/07/17 22:35:44
id:husigi No.2

husigi回答回数107ベストアンサー獲得回数62006/07/17 22:31:43

ポイント23pt

新たに「フィールド4」を作りましょう。

並べたい順に、各データの「フィールド4」に1~5を振っていきます。

最後に「フィールド4」でソートします。

http://dev.mysql.com/doc/refman/4.1/ja/

id:black_kenchan

すいません。説明不足でした。

データは日々増えていき各データに番号を振るのは困難かと思います。

2006/07/17 22:38:18
id:llusall No.3

llusall回答回数505ベストアンサー獲得回数612006/07/17 22:33:05

ポイント22pt

こちらで、いかがでしょうか?


select

  日付, 属性,  商品名

from

  テーブルA tb1

order by

  (select max(tb2.日付) from テーブルA tb2 where tb2.属性 = tb1.属性) desc, 

  日付 desc, 

  属性, 

  商品名

id:birdie-brain No.4

birdie-brain回答回数40ベストアンサー獲得回数42006/07/17 22:45:21

ポイント22pt

1番目の回答者ですが、、、

最初の回答の「テーブルB」というのは、実際にデータベース内に存在するテーブルではなく、SQLクエリ中で定義しているサブクエリが返す結果セットを参照するための別名(仮名)です。

例示したSQL文の中に登場する「(SELECT ~)」がサブクエリで、「AS テーブルB」がサブクエリの結果に対する別名定義になります。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません