人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: black_kenchan
●カテゴリ:ウェブ制作
✍キーワード:2006 MySQL PHP SQL グループ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● birdie-brain
●23ポイント

使用する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

◎質問者からの返答

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

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


2 ● husigi
●23ポイント

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

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

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

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

◎質問者からの返答

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

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


3 ● llusall
●22ポイント

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


select

  日付, 属性,  商品名

from

  テーブルA tb1

order by

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

  日付 desc, 

  属性, 

  商品名


4 ● birdie-brain
●22ポイント

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ