• ベストアンサー
  • すぐに回答を!

1列について重複行を除いて全列をSELECTするSQL文

A B C 1 2 10-01 2 3 10-01 3 2 10-02 4 1 10-03 5 3 10-04 MYSQLで上のようなTABLEから、B列についてCが最新の日付の行を1行ずつ、且つ全列抽出したいです。想定する結果は下記の通りです。 3 2 10-02 4 1 10-03 5 3 10-04 SELECT DISTINCT A FROM table_name ORDER BY C DESC だとB,C列は抽出されず、DIATINCT A,B,Cだと全行抽出されてしまう。 GROUP BY B は平均や集計なら使えるでしょうが最新の1行でないし。 どんなSQL文にすれば良いのでしょうか。よろしくお願いします

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数1282
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

(1)MySQL バージョン5.0以降  まだ開発中バージョンですが、サブクエリがサポートされています。 SELECT * FROM table_name WHERE (B,C) IN(SELECT B,MAX(C) FROM table_name GROUP BY B); (2)MySQL バージョン5.0より前  B列の値毎の最新日付を、一旦、テンポラリテーブル(*1)に格納する方法を示します。 (a)テンポラリテーブルの定義 CREATE TEMPORARY TABLE w_tbl(B B列のデータ型,C C列のデータ型); (b)操作 INSERT INTO w_tbl(B,C) SELECT B,MAX(C) FROM table_name GROUP BY B; SELECT x.A,x.B,x.C FROM table_name AS x,w_tbl AS y WHERE x.B=y.B AND x.C=y.C; *1 MySQL バージョン 3.23 以降では、テーブルの作成時に TEMPORARY キーワードを指定することができます。テンポラリテーブルは現在の接続の間のみ有効で、接続が閉じると自動で削除されます。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

お礼が遅くなりすみませんでした。 テンポラリテーブルという方法があったのですね。 残念ながらご回答頂いた時は既に作成済でした(バージョン5.0より前でサブクエリは使えず結局SQL2度発行にしました)ので次の機会に是非参考にさせて頂きます。 丁寧なご説明ありがとうございました。

関連するQ&A

  • SQL文「DISTINCT」の「ORDER BY」について

    SQL文「DISTINCT」の「ORDER BY」について教えて下さい。 A列をDISTINCTで重複行の排除をしています。 その後、B列でORDER BYをかけたいのですが、エラーが 出てしまいます。A列でのORDER BYは成功します。 何か良い方法があれば教えて下さい。 よろしくお願いします。 SQL="SELECT DISTINCT A列 from table " &_ "WHERE (table.C列='100') " &_ "ORDER BY (table.B列) ASC " ⇒エラー    "ORDER BY (table.A列) ASC " ⇒成功

  • SQLのSELECT文でのランダム抽出について

    SQLのSELECT文でのランダム抽出について データベースSQLiteでSELECT文の結果をランダムに抽出するには ORDER BY RANDOM()を使うようですが、前回ランダムに抽出された順序と同じ結果を得るにはどのようにすればよいでしょうか。 MySQLの場合は、ORDER BY RAND(n)でnの値を同じにすれば、同じ順序で抽出できるようですが、SQLiteでは無理なようです。 今考えているのはRANDOM()で得られた列の一つ(たとえばID)を一時的に別のテーブルを作成して保存後、その一時テーブルを利用するというものですが、もっと良い方法があるのではと思います。 何か別の方法がありましたら、教えていただきたくよろしくお願いいたします。

  • SQL-SELECT文でのソート

    VB2010とmdb(Ms-Access)にてシステムを構築しています。 Select文にて取得したレコードをDatagridviewにて表示しようとしているのですが SQL="SELECT * FROM table ORDER BY ID" 当のシンプルなものだと表示できるのですが 特定の文字列順にソートしたくCASE WHENを使用して SQL = "SELECT * FROM table ORDER BY CASE BUPPIN WHEN '○○' THEN 1 WHEN '△△' THEN 2 ELSE 0 END" のようにSQLを書いてみたのですがデータアタプタにてデータテーブルに結果を入力させる際にエラーが出てしまいます。 構文間違いでしょうか? ご教授お願いします

その他の回答 (1)

  • 回答No.1

こんな感じで。 SELECT SUBSTRING( MAX( CONCAT(c,a) ), 6) AS 'a' ,SUBSTRING( MAX( CONCAT(c,b) ), 6) AS 'b2',MAX(c) AS 'c' FROM table_name GROUP BY b order by a;

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございました

質問者からの補足

ご回答ありがとうございます。なるほど、結合させてMAXとって後ろだけ使う、ですか。全く思いつかなかったですw(゜o゜)wただもし長さが変なcが混ざってた場合のa,bの抽出が心配な気もします。6はその長さのことですよね? あと下記訂正です。 >SELECT DISTINCT A FROM table_name ORDER BY C DESCだとB,C列は抽出されず[誤] ⇒SELECT DISTINCT B FROM table_name ORDER BY C DESCだとA,C列は・・・[正]

関連するQ&A

  • SQL文に変数を埋め込む場合の方法

    //config.php //$table = "TableName"; 1:require "config.php"; 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM TableName GROUP BY " . 4:$fld; $res = mysql_query($sql, $conn) or die("Data抽出エラー"); 上記のソースを 2:$sql = "SELECT " . $fld . " AS genre, 3: COUNT(*) AS cnt FROM " . $table . " GROUP BY " . $fld; 4: $res = mysql_query($sql, $conn) or die("Data抽出エラー"); この様にして、config.phpより、テーブル名を変数として読み込みたいのですが、エラーになってしまいます。 3行目をどのように記述すればよいのでしょうか?

    • ベストアンサー
    • PHP
  • SELECT文のソートについて

    SQLのSELECT文で抽出した列Aの値が、例えば1~12であるとして、それを4~12、1~3という具合にソートしたいのですがやり方がわかりません。 ORDER BY句を使えばいいのか、それとも全く別の方法を使うのか教えてください。 よろしくお願いします。

  • sql文の書き方

    いつもこちらで勉強させていただきます。 環境:mysql5.0 PHP5.1.4 apache 2.0.58 いま画面からパラメータ5受け取りました。 これをもってsql文を書こうとするが必須入力項目ではないため一つずつ判断して書いたら30種類の可能性がでてきてすごく長くなってしまいましたがなんか短縮させるいい方法はありませんか?またこれをファンクションで作り直そうとしたらちょっとうまくいかないのでどなたか教えてもらえませんか?ファンクションで渡すパラメータ($sql?$query?あるいは各パラメータですか? )は何にすればいいか?取得したい検索結果は配列です。ファンクション戻り値を連想配列にすることは可能ですか?ちょっと困っています。 $sql = "SELECT * FROM file_tbl WHERE"; // A だけの場合 if ( $b == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." a='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($a)); // B だけの場合 }else if( $a == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." b >='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($b)); // Cだけの場合 }else if( $a == "" and $b == "" and $d=="" and $e==""){ $sql = $sql." c <='%s' order by b DESC,a"; . . . // SQL クエリを実行する $result = mysql_query($query); よろしくご教授願います。

    • ベストアンサー
    • MySQL
  • 秀丸でSQLを書く際に SQLの予約語だけ大文字

    秀丸でSQLを書く際に SQLの予約語だけを、大文字に変換するよい方法は? たとえば select * from table_1 where id=1 order by id desc; と書いて、マクロを起動すると SELECT * FROM talbe_1 WHERE id=1 ORDER BY id DESC; となるようにするよい方法はありませんか? また、予約語が「強調」されると尚良いです。

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード

  • Acess2003で複雑なSQL?

    Access2003で以下のSQLを実行させることはできるのでしょうか? 直接SQLで実行する方法と、Access独特の両方で実行する方法が知りたいです。 select name, count(*) from テーブル group by name order by 2 desc;

  • SQLの結果が返ってこない

    PHP+mysqlで以下のようなSQL文で処理を行ったのですがデータが返ってきません。 $sql = 'SELECT * FROM books WHERE id=3'; $recordSet = mysql_query($sql); if(mysql_fetch_assoc($recordSet)){ while ($table = mysql_fetch_assoc($recordSet)) {        処理     } } mysqlの画面で SELECT * FROM books WHERE id=3 を入力してみるとしっかりと結果が返ってきます。 ちなみに1行目を、違うテーブルの $sql = 'SELECT * FROM podcast WHERE code=3 ORDER BY dcdate DESC LIMIT 0,3'; にしてみると、データが表示されます。 2日間かけてずっと試行錯誤してみたのですが、完全に行き詰ってしまったので、何か考えられる原因はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 最新から100行のSELECT文

    タイトルわかりにくくてすみません・・・ logno | value 1 | abc 2 | bcd ・ ・ ・ 2000 | def 2001 | efg のようなデータがあるとします。(データは2002,2003とどんどん追加されます。) このとき、lognoが1902~2001(つまり最新から100行)のデータを読み込むSELECT文を教えてください。 SELECT * FROM table_name ORDER BY logno DESC LIMIT 100; のようにして今まで取り込んできましたが、これでは順序が逆になってしまいます。(2001,2000...の順になってしまう) 逆にならない方法を教えてください。

    • ベストアンサー
    • MySQL
  • SQL文のGROUPとORDERの順番

    こんににちは、 得点表(学生番号、科目コード、得点)があります。 得点表から各学生の合計得点を求めて降順に整列する場合の正解は、 SELECT 学生番号,SUM(得点) FROM 得点表 GROUP BY 学生番号 ORDER BY 2 DESC だったのですが、この2はSUM(得点)のことでしょうか? また、 SELECT 学生番号,SUM(得点) FROM 得点表 ORDER BY 2 DESC GROUP BY 学生番号 のようにGROUP と ORDER をひっくり返した場合、間違いになるのでしょうか? お分かりの方がいましたら教えてください。 よろしくお願いします。

  • 重複データの抽出方法(複数項目)

    以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。 a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 02 |01 |01 |01 03 |02 |01 |03 04 |02 |02 |03 05 |01 |01 |02 06 |02 |02 |03 select * from テスト where c in (select c from テスト group by c,d having count(*)>1) and d in (select d from テスト group by c,d having count(*)>1) そうしたところ、以下の結果になってしまいました。 想定では、○のレコードだけ抽出できると思ったのです。 ×のレコードを抽出したくないのですが、SQLのどこが 間違っているのでしょうか? a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 ○ 02 |01 |01 |01 ○ 03 |02 |01 |03 × 04 |02 |02 |03 ○ 06 |02 |02 |03 ○ (使用DB)SQLServer2000