MYSQLで同一テーブルをループして検索する方法

このQ&Aのポイント
  • MYSQLで同一テーブル内のデータをループして検索する方法について教えてください。
  • FOLDER1とFOLDER2が同じレコードをループして検索する際に、FOLDER1のデータを保持しながら結果を取得したいです。
  • 求める結果は、FOLDER1とFOLDER2が同じレコードを結合し、スラッシュで区切った文字列として取得したいです。
回答を見る
  • ベストアンサー

MYSQLにて同一テーブルをループして検索する方法

MYSQLの質問です。 <データ> |--|----------|---------| |ID|FOLDER1 |FOLDER2 | |--|----------|---------| |01|AAAAA1 |NULL | |02|AAAAA2 |AAAAA1 | |03|AAAAA3 |AAAAA2 | |04|AAAAA4 |AAAAA3 | |05|AAAAA5 |NULL | |06|AAAAA6 |AAAAA5 | |07|AAAAA7 |AAAAA6 | |08|AAAAA8 |AAAAA7 | |09|AAAAA9 |AAAAA8 | |10|AAAAA10 |AAAAA9 | ---|----------|---------- <条件> FOLDERがNULLでない場合、処理を繰り返す <処理> 同一テーブル上で、 FOLDER1とFOLDER2を比較して同じであればFOLDER1のデータを保持し、 "/"を追加して次に取得した結果に接続する <取得したい結果> AAAAA1/AAAAA2/AAAAA3/AAAAA4/AAAAA5 AAAAA5/AAAAA6/AAAAA7/AAAAA8/AAAAA9/AAAAA10 上記を1回で検索するSQLがご存知の方がいらっしゃいましたら、ご教授ください。

  • MySQL
  • 回答数1
  • ありがとう数1

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

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

ああ、親子関係がネストするのはSQLの一番不得意なデータの持ち方ですね 問題点が2点 (1)もしAAAAA・・・というのがフォルダ名だとすると、フォルダ名でネストの判断する をするのは危険です。同じ名前のフォルダがあった時点でアウトです (2)分岐があったときどうしたいか書かれていません (1)については名前ではなくidで処理できます。 ただデータの持たせ方が間違えるとフォルダーがループしてしまう可能性があります それを防ぐにはルートからのネストを最初全部記載してしまう手があります。 |ID|FOLDER1|PATH| |--|----------|---------| |01|A1 |/ | |02|A2 |/A1/ | |03|A3 |/A1/A2/ | |04|A4 |/A1/A2/A3/ | |05|A5 |/ | |06|A6 |/A5/ | |07|A7 |/A5/A6/ | |08|A8 |/A5/A6/A7/ | |09|A9 |/A5/A6/A7/A8/ | |10|A10 |/A5/A6/A7/A8/A9/ | しかし、こうしてしまうと、フォルダの付け替えをしたときに それ以下の全てのpathを修正する必要がでてくるため工夫が必要です。 さらにつっこんで入れ子集合モデルという考え方でデータを 処理することもできますが、この構造をつくるのもそれなりに面倒です いずれにしろ複雑な処理なので真剣にやる気がなければ諦めた方がいいです。 http://www.makizou.com/archives/1616 http://www.geocities.jp/mickindex/database/db_tree_ns.html

wakarannyo2010
質問者

お礼

際と参考にさせていただきました。 LEFTJOINを使用してやってみます。 ありがとうございました。

関連するQ&A

  • メインデータと最新サブデータのテーブル結合について

    お世話になっております。 MySQL4.1にて以下のようなデータを取得したいと考えています。 1回のSQLで何とかとりたいと考えているのですが、 良いお知恵はないでしょうか? ▼Aテーブル ID(PK) メインメモ ▼Bテーブル ID(PK) 日付(PK) サブメモ ▼取得したい結果 ID(1) メインメモ 最新サブメモ ID(2) メインメモ 最新サブメモ ID(3) メインメモ null ・「メインメモ」と「サブメモ」は1対多の状態です。 ・IDごとに1行だけメインメモと最新のサブメモを取得したい。 ・サブメモがなくてもメインメモだけでも取れる。  (Aテーブル LEFT OUTER JOIN Bテーブルの関係) 上記の条件でデータを取得したいと考えております。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLで同じデータにフラグ付け出来ますか?

    データベースの初心者です。MySQLを使用してSQL文を試しましたが、うまくいきません。 わかりやすく教えていただけますか? 下のような2つのテーブルで、テーブル2の項目カラムに存在するデータが、 テーブル1の区分にあれば、一致する行(NOカラムの5~7)だけに、 フラグ”1”を付けたいのです。(区分カラムに、"*"で始まるデータは除きます) 区分に、データが全て埋まっていれば簡単に出来るのですが、 先頭行のみデータがあって、次の区分まで、Nullが入っています。 テーブル1 NO 区分 フラグ 1  aaaaa   null 2  null     null 3  null     null 4  null     null 5  bbbbb   null 6  null     null 7  *nozoku  null 8  ccccc null 9  null null テーブル2 NO 項目 1  bbbbb 2  eeeee よろしくお願いします。

    • ベストアンサー
    • MySQL
  • mySQLの内部結合について

    現在mySQLを使って、SQL文の勉強をしているのですがわからないことがあり、質問させていただきました。 テーブル同士をINNER JOINして結果を取得して、これに対してさらに別の処理(Whereなど)を行いたいのですが、うまくやり方がわかりません。 具体的にSQL文でいうとこんな感じです(ただしエラーが出て動きません)。 SELECT cmaster.comic_id,tags,title FROM mysql.comic_tag as ctag INNER JOIN mysql.comicmaster as cmaster ON ctag.comic_id = cmaster.comic_id AND WHERE tags = 'aa' この処理でやりたいことを説明するとcomic_tagとcomicmasterを結合して、その結果に対してさらにWhereでデータを絞るということしています。 このような場合はどのように処理をしたらいいんでしょうか?またjoinした後のデータを、既存のテーブルのように扱いたいのですが、なにか方法はないのでしょうか?

    • ベストアンサー
    • MySQL
  • 【Access2000】テーブルを検索条件にした削除クエリ

    テーブル1 ID 名前 1  さとう 2  たかはし 3  こんどう 4  やまだ 5  いしかわ テーブル2 ID 2 4 5 上記、データを使用して、「テーブル2に登録されているIDが同じレコードを、テーブル1から削除するためのクエリ」を作成することは出来ますでしょうか? 結果として以下のようになることが希望です。 テーブル1 ID 名前 1  さとう 3  こんどう 削除クエリを作成して、条件で"ID=2"とすれば"2 たかはし"はもちろん削除されます。 しかし、条件を"like [テーブル2]![ID]"としても何も削除されません。 このような処理は可能でしょうか? 可能であればSQLを記述せずに実現させたいのですが可能でしょうか? (SQLは未熟者でして。。。) よろしくお願い致します。

  • JAVA+MySQLのテーブルロックについて

    Java + MySQL5(MyISAM)でテーブルをロックする処理をかけようと 試みているのですが、上手くロックが掛からずにエラーになります。 テーブル「AAA」と「BBB」にロック処理を行おうと思います。 Connection con = null; Statement ps = null; String sql = null; Class.forName("com.mysql.jdbc.Driver"); con = (Connection) DriverManager.getConnection(url, user, pass); ps = con.createStatement(); sql = "LOCK TABLES AAA WRITE,BBB WRITE"; int a = ps.executeUpdate(sql); sql = "UPDATE AAA SET ~省略~"; a = ps.executeUpdate(sql); sql = "INSERT INTO BBB SET ~省略~"; a = ps.executeUpdate(sql); sql = "UNLOCKS TABLES"; a = ps.executeUpdate(sql); 上記の記述でどこに誤りがあるのでしょうか? お知恵を拝借できないでしょうか。 宜しくお願い致します。

  • MySQL5でキーがないテーブルの結合はできますか?

    MySQL5なのでサブクエリが使えるのですが、 A x Bのレコードを返したいのですがSQLで可能でしょうか? ■テーブルA a_id b_id 1 1 1 2 ■テーブルB c_id 1 2 ■期待する結果 a_id b_id c_id 1 1 1 1 2 2

    • ベストアンサー
    • MySQL
  • MySQL: 複数テーブルのcount

    複数テーブルの総行数(count値)を取得したいのですが、下記だとテーブルA,B,Cの結果が バラバラに出力されてしまいます。 【入力条件】 mysql> select COUNT(*) AS 列ID from テーブルA      union all      select COUNT(*) AS 列ID from テーブルB      union all      select COUNT(*) AS 列ID from テーブルC; 【出力結果】       +-----+       | 列_ID |       +-----+       |  1  | ←テーブルAの合計:行数       |  2  | ←テーブルBの合計:行数       |  3  | ←テーブルCの合計:行数       +-----+ 総行数:6を一発で取得するには、どのようにしたらよろしいのでしょうか? 大変恐縮ですが、ご教授よろしくお願いいたいます。 <<MySQLのverは5,5です。

    • ベストアンサー
    • MySQL
  • 2つのテーブルからデータを取り出す mysql

    Mysql  2つのテーブルからデータを取りたいです。 テーブル名 aman id : amemberid : bookid : kakaku : sonota : day テーブル名 bman id : bmemberid : bookid :title : day この二つのテーブル amanからkakaku,sonota。bmanからtitleを取り出したいのですが どのようなSQLになるのでしょうか。 bookidは2つのテーブルに同じ数字番号が入るようになっています。 ソース $sql='SELECT * FROM aman WHERE bookid=? JOIN message2 ON aman.bookrid=bman.bookrid'; $stmt=$dbh->prepare($sql); $data[]=$carid; これではだめでした。

    • ベストアンサー
    • MySQL
  • MySQL 2つのテーブルから情報を得る

    【質問内容】 出稿した求人広告に関する情報を収めたデータベース内に、以下の2つのテーブルがあります ※以下の文章を読むより、添付画像をご覧頂いたほうが分かりやすいと思いますが 1.出稿した求人広告の情報 テーブル名:ad_info id ID plan 広告プラン名 date_from DATE 広告開始日 2011-12-16 date_until DATE 広告終了日 2011-12-31 price 広告料金 2.求人サイトへのアクセス情報(広告掲載期間のみ毎日2時間おきに収集) テーブル名:daily_access id ID created_at DATETIME クローリングした日時 2011-12-16 17:00:00 pv プレビュー数 applicants 応募者数 occupation_ranking 職種別画面での自社の掲載順位 newly_ranking 新着企業画面での掲載順位 この2つのテーブルからad_infoの広告ごとに(その掲載期間ごとに)、daily_accessのデータを集計したいと思っています。しかしそのためのSQL文がうまく書けず、詰まっています。 どうか良い方法を教えていただけませんでしょうか。 あるいは「テーブル構造自体を変えたほうがいいよ」、「SQL文の書き方が良くないよ」など直接関係のないことでも大歓迎です。 よろしくお願いします。 【MySQLバージョン情報】 $ mysql --version mysql Ver 14.14 Distrib 5.5.16, for Linux (x86_64) using EditLine wrapper 【テーブル作成文】 CREATE TABLE `ad_info` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `plan` VARCHAR(30) DEFAULT NULL, `date_from` DATE DEFAULT NULL, `date_until` DATE DEFAULT NULL, `price` INTEGER DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `daily_access` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `created_at` DATETIME NOT NULL, `pv` INTEGER DEFAULT NULL, `applicants` INTEGER DEFAULT NULL, `occupation_ranking` INTEGER DEFAULT NULL, `newly_ranking` INTEGER DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    • ベストアンサー
    • MySQL
  • mySQL 複数テーブルから検索したい

    はじめまして、よろしくお願いします。 職場環境がかわり、はじめてmySQLを使用しています。 3つのテーブルから情報を検索したいのです。 [テーブル名: cast] name             // PRIMARY KEY age (例 なまえ1, 22 なまえ2, 28 なまえ3, 25 [テーブル名: photo] name order             // 写真表示順 (INT) url               // 写真格納先URL (例 なまえ1, 0, http://なまえ1A.jpg なまえ1, 1, http://なまえ1B.jpg なまえ1, 2, http://なまえ1C.jpg なまえ3, 0, http://なまえ3A.jpg [テーブル名: schedule] name workday           // 出勤日 (DATE) starttime          // 出勤時間(TIME) finishtime          // 退勤時間(TIME) (例 なまえ3, 2013-02-04,  9:00, 17:00 なまえ2, 2013-02-05, 10:00, 18:00 なまえ2, 2013-02-06, 10:00, 18:00 なまえ2, 2013-02-07, 10:00, 18:00 キャスト情報(cast)とそのキャストの写真格納先URL(photo)とキャストの出勤時間(schedule)のテーブルです。 ※キャストは何枚でも写真を登録できます。登録していない場合もあります。 キャストのリストを表示したいです。 表示したい項目は cast.name, cast.age, photo.url, schedule.starttime, schedule.finishtime になります。 期待する結果は(2月5日の場合) なまえ1, 22, なまえ1A.jpg, NULL, NULL なまえ2, 28, NULL,     10:00, 18:00 なまえ3, 25, なまえ3A.jpg, NULL, NULL すべてのキャストを表示します。 photo.urlはphoto.order=0のもの(photo.order=0の写真をサムネイル表示に使っています) 2月5日に出勤情報があれば表示 いろいろ考えたのですが、どうしても photo にデータがない("なまえ2")のところでつまづいてしまって、どうにも。。。 とりあえずPHPでそれぞれのテーブルの情報を取得して 自分で UNION、 USING('name') みたいな処理してますが、ソースがとっても恰好悪いです。 ズバッとしびれるSQL文をどうかご教示していただきたく、投稿しました。 よろしくお願いいたします><

    • ベストアンサー
    • MySQL