mysql:8125
From: "Kawaji, Shinya" <"Kawaji, Shinya" <kawaji@xxxxxxxxxx>>
Date: Sat, 09 Aug 2003 23:37:26 +0900
Subject: [mysql 08125] Re: 特定フィールドの異なりによる抽出
かわじ、です。 > このとき、SOURCE ごとに一つずつ取り出した次のような結果を得たいのです。 正確に言えば SOURCE ごとに「IDが最小の行を」一つずつ取り出した次のような結果 ということですよね? MySQL 4.1 以上になると副問い合わせが出来ますが、まだ安定版ではないので、 それ以下でする場合は、以下のマニュアルに記されている方法になるかと 思います。 http://www.mysql.com/doc/en/example-Maximum-column-group-row.html temporary table を使うやり方と、"MAX-CONCAT trick" なるものを使うやり方 が書かれています。 後者の方を、今回の場合に用いると、以下のようになります。 (MAX ではなく、"MIN-CONCAT trick" ですが) -- 10 や 11 のところは、ID の最大文字長に合わせて下さい。 select 0 + left( min(concat(lpad(ID, 10, '0'), ID) ), 10) as ID, SOURCE, CONTENT, substring( min(concat(lpad(ID, 10, '0'), NOTE)), 11) as NOTE from SAMPLE where CONTENT = 'x' group by SOURCE ; +------+--------+---------+------+ | ID | SOURCE | CONTENT | NOTE | +------+--------+---------+------+ | 1 | A | x | abc | | 6 | C | x | rst | +------+--------+---------+------+ select 0 + left( min(concat(lpad(ID, 10, '0'), ID) ), 10) as ID, SOURCE, CONTENT, substring( min(concat(lpad(ID, 10, '0'), NOTE)), 11) as NOTE from SAMPLE where CONTENT = 'y' group by SOURCE ; +------+--------+---------+------+ | ID | SOURCE | CONTENT | NOTE | +------+--------+---------+------+ | 3 | A | y | hij | | 4 | B | y | klm | | 7 | C | y | vwx | +------+--------+---------+------+ エレガントとは言いづらいですし、保守しやすいとも言えませんが、 一応、SQL一発で出来るということで・・・ マニュアルにある temporary table 作成の方法は、一つしか table を 作らないので、その方が良いかも知れません。
8122 2003-08-09 21:39 ["TOYOSHIMA,Masayuki"] 特定フィールドの異なりによる抽出 8123 2003-08-09 22:33 ┣[yamada <tirutiru@xxx] 8124 2003-08-09 22:53 ┃┗[yamada <tirutiru@xxx] -> 8125 2003-08-09 23:37 ┗["Kawaji, Shinya" <ka] 8126 2003-08-10 07:21 ┣["TOYOSHIMA,Masayuki"] 8127 2003-08-10 08:17 ┃┗["Kawaji, Shinya" <ka] 8128 2003-08-10 08:59 ┃ ┗["TOYOSHIMA,Masayuki"] 8129 2003-08-10 09:24 ┗["KAWAI,Takanori" <GC] 8130 2003-08-10 13:07 ┗["TOYOSHIMA,Masayuki"]