テーブルT_AからIDに1が含まれるデータをカウントして最新更新日でソートする方法

このQ&Aのポイント
  • テーブルT_AからIDに1が含まれるデータを全て抽出し、かつそれぞれのカウントを抽出し、かつ最新更新日でソートする方法について教えてください。
  • データ数が2000程度のテーブルで30秒ほどの時間がかかるとのことですが、より速くする良い方法はありますか?
  • 速度向上のための最適化方法についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

速度向上。

速度向上。 Select A,B,C, (Select Count(*) FROM T_A WHERE SOME_ID = A.SOME_ID ) COUNTER , (Select MAX(REGISTER_TIME)FROM T_A WHERE SOME_ID = A.SOME_ID)MAX_REG_TIME FROM T_A as A WHERE ID LIKE '%1%' GROUP BY ID ORDER BY MAX_REG_TIME; テーブルT_AからIDに1が含まれるデータを全て抽出し、かつそれぞれのカウントを抽出し、かつ最新更新日でソートしたいと思います。 データ数が2000程度のテーブルで30秒ほどの時間がかかります。 より速くする良い方法はありますでしょうか?

  • MySQL
  • 回答数3
  • ありがとう数14

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

構造がいまいちわからないので微妙ですが(たとえばSOME_IDとIDの関係とか) SELECT A.SOME_ID,A,B,C,COUNTER,MAX_REG_TIME FROM T_A AS A INNER JOIN (Select SOME_ID,Count(*) AS COUNTER, MAX(A.REGISTER_TIME) AS MAX_REG_TIME FROM T_A AS A A.SOME_ID) AS SUB ON SUB.SOME_ID=A.SOME_ID WHERE A.ID LIKE '%1%' 的な処理になるのでは? ただLIKE '%1%'のような処理はインデックスが聞かないのでSQL的にはNGです

sadoru
質問者

お礼

返事が遅くなりすいません。 おっしゃる通りで解決致しました。 ありがとうございます。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

A,B,C,COUNTER,MAX_REG_TIME はグループ化項目ではないので、 文法に厳しいエータベースシステムではNGです。 >(Select Count(*) FROM T_A WHERE SOME_ID = A.SOME_ID) >(Select MAX(REGISTER_TIME)FROM T_A WHERE SOME_ID = A.SOME_ID) これの意味が不明です。 SOME_ID毎の件数と最大値を求めているのでしょうが、IDでグループ化したら どうなるのかが不明ですね。つまり、同じIDでSOME_IDが違うデータがあると、 COUNTERもMAX_REG_TIMEも複数の値が発生するのですが、出力は1個に限る ので、最大/最少/平均などの指示を与えなければなりません。 こういった「何をやりたいの?」が分からないクエリですと困るので、 もう一度、仕様の説明を入れてください。

sadoru
質問者

お礼

お返事が遅くなりすいません。 yambejp様の通りで解決致しました。 ありがとうございます。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

WHERE句で指定している項目にINDEXを作成する。

sadoru
質問者

お礼

お返事が遅くなりすいません。 yambejp様の通りで解決致しました。 ありがとうございます。

関連するQ&A

  • 最後のデータを含むレコード1行 MYSQL

    お世話になります。 最後の日にちを含むレコード全ての抽出方法がどうしてもわかりません。 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 4 AA 3/2 7 5 BB 3/2 4 6 AA 3/3 1 これを、select * from テーブル group by name とすると、 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 select id, name, max(date),amount from テーブル group by name とすると、 id name date amount 1 AA 3/3 5 2 BB 3/2 5 3 CC 3/1 5 望んでいる結果はこうです。最後のdateを含むレコード全てです。 id name date amount 3 CC 3/1 5 5 BB 3/2 4 6 AA 3/3 1 select * from テーブル as a where a.date=(select max(b.date) From テーブル as b where a.id=b.id); このようにしましたが、データの数が膨大なのですごく時間がかかってしまいます。 他、シンプルな方法はないでしょうか。 よろしくお願いします。 MYSQL バージョン5.0.45

  • mysqlでSELECTの速度を上げる方法

    以下のようなSQLを発行すると、mysqlの処理時間が非常に多くかかるため、なんとか最適化を行いたいと考えています。 どのような方法があるのか教えていただけませんしょうか。 SELECT user_id,comment,comment_id,date,study_time,study,source FROM data_temp t1 WHERE NOT EXISTS (select comment_id from data t2 where t1.comment_id = t2.comment_id) ■補足 ・dataとdata_tempのテーブル構造は全く同じです。 ・SQLで実現したいことは、両テーブルのcomment_idをキーとして、dataに含まれないdata_tempの差分データを表示させたい。 なお、以下のインデックス作成は行いましたが、結果変わらずでした。 alter table data t1 ADD INDEX_t1 (user_id,comment,comment_id,date,study_time,study,source); alter table data_temp t1 ADD INDEX_t1 (user_id,comment,comment_id,date,study_time,study,source); よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データの無いテーブルと結合してデータ抽出

    以下のテーブルを使用してデータを抽出したいのですが、データが抽出できません。 名称テーブル -------------------- ID | NAME | -------------------- 0   AA 1   BB 2   EE 3   FF 履歴テーブル -------------------- ID | DAY | OLDNAME -------------------- 2   2004   CC 3   2004   DD 結果取得したいデータ -------------------- ID | NAME | OLDNAME -------------------- 0   AA =現在のSQL= SELECT A.ID, A.NAME, B.OLDNAME FROM 名称 A , 履歴 B WHERE A.ID = B.ID(+) AND A.ID=0 AND B.DAY =  (SELECT MAX(C.DAY)  FROM 履歴 C  WHERE  A.ID = C.ID(+)) 履歴テーブルには名称テーブルの履歴があります。 履歴にデータが無くても名称データを取得したいのですが、こういった場合はどのようなSQLを作ればいいのでしょうか。

  • 金額が確定されなかった品物の価格履歴を削除するDelete文

    各品物の価格変動の履歴と確定値を残す 下のようなテーブル(T_Rireki)があるとします。 | HinBan | Junban  | Nedan  | Kakuteki | ---------------------------------------- |   A   |   1   |   90   |   0    | |   A   |   2   |   80   |   0    | |   A   |   3   |   70   |   1    | |   B   |   1   |   95   |   0    | |   B   |   2   |   90   |   0    | |   B   |   3   |   95   |   0    | |   C   |   1   |   35   |   0    | |   C   |   2   |   30   |   1    | ここから、値段が確定していない( 列 Kakutei の値が 最終的に 1 になっていない) 品番を探し(この場合は、B) それをテーブルから削除したいのです。 目的の行の抽出は、 Select * from T_Rireki as T1 Where (select Max(Kakuteki) from T_rireki where HinBan= T1.HinBan) = 0 もしくは、 Select HinBan , Max(Kakuteki) as M_Kakutei from T_Rireki group by Hinban Having M_Kakutei = 0 などによって、 | HinBan | Nedan | -------------------- |   B  |   95  | |   B  |   90  | |   B  |   95  | の目的の3行を得ることができますが、この3行を削除するためにDelete文に上記のSQLを含もうとするとエラーがでます。 例えば、 Delete from T_Rireki as T1 Where (select Max(Kakuteki) from T_rireki where HinBan= T1.HinBan) = 0 では、うまくいきません。 どのような文にすればいいか、わかる方、どうか教えていただけないでしょうか?

  • SQL文でデータを抽出できない。

    現行のSQL文でACCESSからデータを抽出してきていたのですが、それでは問題が起きてしまったので、以下の内容にSQLを変更したいのですが、思うようにできません。 詳しい方がいましたらご教授願います。 お手数ですが、困っているのでよろしくお願いいたします。 *現行のSQL* 日付が最も若いものでかつ、IDとSUBJECTに重複のない データを抽出する。 "SELECT .sID,B.subject,B.D_time FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data GROUP BY sID,subject) A INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;" *変更したいSQL* ある範囲の日付の中で(日付は、入力画面から抽出)日付が最も若いものでかつ、IDとSUBJECTに重複のないデータを抽出する。 "SELECT .sID,B.subject,B.D_time FROM (SELECT sID,Min(D_time) AS mtime ,subject FROM Reg1Data WHERE D_time <= & w_jyukobistart GROUP BY sID,subject) A INNER JOIN Reg1Data B ON A.sID=B.sID AND A.mtime=B.D_time GROUP BY B.sID,B.subject,B.D_time ORDER BY B.sID,B.subject;" 以上を実行すると、 [Microsoft][ODBC Microsoft Access Driver] クエリ式 'D_time <= & w_jyukobistart' の 構文エラー : 演算子がありません。 というエラーが出ます。 ちなみにw_jyukobistart はWEBの画面上に入力された抽出したいデータ範囲(from)です。 この変数の使い方に問題があるのか、それともSQL文自体に無理があるのか、最も良い方法をお尻の技術者の方、お答えいただけるとうれしいです。

  • PostgresSQLで累計計算を処理したい

    SQLで以下のような処理をさせています。 select id,売上,入金,(select sum(売上-入金) from t1 where id<=x.id) as 累計 from t1 as x order by id ; データ行が少ない時は問題ないのですが、多くなるにつれ時間がかかります。最悪はタイムアウトが発生してしまいます。 中間テーブルを使う手もありますが、あまりしたくないので、どのようにすると高速処理が出来るのでしょうか? アドバイスをいただけませんか?

  • SQL文 この部分はなんていうのでしょう?

    SELECT T_テーブル1.フィールド1 FROM T_テーブル1 ORDER BY T_テーブル1.フィールド1; なら、 ”ORDER BY句” SELECT T_テーブル1.フィールド1 FROM T_テーブル1 WHERE (((T_テーブル1.フィールド1)="A")); なら ”WHERE句” と言いますが、 DELETE Table1.* FROM Table1; や UPDATE テーブル1 Set テーブル1.フィールド1 = "い" WHERE (((テーブル1.フィールド1)=”あ")); や DROP Table Table1; の deleteやupdateやdropの部分は何て言うのでしょうか? そのまま、SELECT句DELETE句などというのでしょうか?

  • 不明なコマンドです("FROM")。行の残りは無視されました。 のエラー

    T_地点,T_層,T_回 という三つのテーブルがあります。 それを組み合わせるSQLで下記のようなものがあります。 --------- CREATE VIEW V_地点 AS SELECT T_地点.ID, TABLE1.1A, TABLE1.2A, T_回.形 FROM T_地点,T_回, ( SELECT T_層.ID, T_層.点, MAX(DECODE(T_層.コード,'01',1)) 1A, MAX(DECODE(T_層.コード,'02',1)) 2A FROM T_層 GROUP BY T_層.ID ) TABLE1 WHERE T_地点.ID = TABLE1.ID AND T_地点.ID = T_回.ID; --------- これをORACLEのビュー作成で実行するとエラーがでないのですが、 sqlplus経由で実行するとエラーがでます。 SP2-0042: 不明なコマンドです("FROM")。行の残りは無視されました。 SP2-0734: "T_..."で開始するコマンドが不明です - 残りの行は無視されました。 どなたかわかるかたがいらっしゃいましたらご教授ねがいます。

  • sqlのwhereで指定した条件の前後を取得したい

    テーブル=T) KEY DATA 001 あ 002 い 003 う 004 え 005 お SQL) SELECT DATA FROM T WHERE KEY = 003 ; 上記のSQLでは、「う」のデータしか取得できませんが、 「003」の前後1件、合計3件の「い」「う」「え」を取得する方法を教えて下さい。 ちなみに、 SELECT DATA FROM T WHERE KEY >= 003 AND ROWNUM <= 2 と SELECT * FROM ( SELECT DATA FROM T WHERE KEY < 003 ORDER BY KEY DESC ) WHERE ROWNUM < 1 のUNIONでは上手く行きませんでした。 よろしくお願いします。

  • 重複レコードのある項目を比較し更新する方法

    nameで重複しているレコードをDateの 最新の日のレコードのIDをTGT_IDに入れたいのですが select * from テーブル名 where name in ( select name from テーブル名 group by name having count(*) > 1 ) と重複したカラムを抽出まではできるのですが そこからどうしたらいいのか分かりません どなたかご教授をお願いします。 ID name date tgt_id 1 A 20040403 2 2 A 20040625 2 3 B 20040429 4 4 B 20040623 4