質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

2162閲覧

SQLを複数使う場合

cacao86

総合スコア97

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2020/04/03 06:20

編集2020/04/03 07:37

deleted_atがnullのデータだけ抽出しようと思っています。
また、親はparent_id is nul, 子はid = parent_idのように親子関係を持たせています。
なのでdeleted_at is not nullの親だったら子も抽出されないようにしようとしていますが上手く取り出せません。
したのphpでは1つ目のクエリで親のidを取得しています。そのidを$idに入れて、2つ目のクエリでparent_idが親のidと合致しているデータを抽出しようとしています。

php

1$stmt = $db->prepare("select * from t_bbs where parent_id is null and deleted_at is null"); 2 $stmt->execute(); 3 $data =$stmt->fetchAll(); 4 5 foreach($data as $value) { 6 $id = $value['id']; 7 $stmt = $db->prepare("select * from t_bbs where deleted_at is null and (parent_id = $id or parent_id is null) order by id asc"); 8 $stmt->execute(); 9 $res = $stmt->fetchAll(); 10 print_r($res); 11}

現状ですと最初だけ親子だけを取り出すのですが以降はずっと親だけ取り出してしまいます。

お力添えいただきたく思います!
お願い致します!

追記

テーブル定義です。テーブルは1つだけです。親と子だけなので2階層になります。

| t_bbs | CREATE TABLE `t_bbs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `subject` varchar(255) DEFAULT NULL, `body` text DEFAULT NULL, `parent_id` int(11) DEFAULT NULL, `post_user` varchar(8) DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT current_timestamp(), `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), `deleted_at` datetime DEFAULT NULL, KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1590 DEFAULT CHARSET=utf8 |
+-----------------+ | version() | +-----------------+ | 10.4.12-MariaDB | +-----------------+

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yodel

2020/04/03 06:24

t_bbsのテーブル定義を提示してください。。
yambejp

2020/04/03 06:47

テーブル定義についてはcreate table形式で表示してください
yodel

2020/04/03 07:10 編集

今後でも良いので、テーブル定義は、ソースコード同様にマークアップするようにしてください。 掲示板のツリーを親子IDで表したテーブルだと思いますが、何階層下まで読み込む予定でしょうか? MySQL8であれば、WITH句を利用したクエリが利用できます。質問時にDBバージョンも明記があると良いですね。
guest

回答3

0

ベストアンサー

**「削除された親が存在しない」**という条件にすればよいだけのような?

SQL

1select * 2from t_bbs bbs 3where deleted_at is null 4 and not exists( 5 select 1 from t_bbs 6 where id=bbs.parent_id and deleted_at is not null 7 )

投稿2020/04/03 10:46

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/04/03 11:01

それするならトリガー作成して子も論理削除では
yodel

2020/04/03 12:33

コレですね。 そもそもテーブル設計どうなの、やりたい事何っていうのはありますが。。
cacao86

2020/04/06 05:35

こちらを実行したら見事期待通りに動作しました! うまい条件の視点が自分には持てていませんでした。 exists文も知らなかったので勉強させていただきます! ありがとうございました!
guest

0

ゴールが分からないですが、欲しい結果はこんな感じでしょうか?
インデックスが効かない設計、クエリだと思うので、性能面には気を付けてください。

SQL

1select * from t_bbs 2where parent_id is null and deleted_at is null 3union all 4select child.* from t_bbs parent 5inner join t_bbs child on parent.id = child.parent_id 6where parent.deleted_at is null 7and child.deleted_at is null;

投稿2020/04/03 08:21

編集2020/04/03 08:25
yodel

総合スコア508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なにをしたいかイマイチわかりませんが
別々に実行するのではなくjoinすればよいだけのように見受けられます

投稿2020/04/03 06:25

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/04/03 06:26

とくにループ処理の中でsql文を発行するのはフロー的には 最悪だと思います
cacao86

2020/04/03 06:40

ご回答ありがとうございます! 結合された場合 親は子の数分表示されてしまわれませんでしょうか? ループ処理の中でsql文を発行するのは最悪なのですね。。。以後気をつけます。
yambejp

2020/04/03 06:48

> 親は子の数分表示されてしまわれませんでしょうか? 親を表示するような処理が書いてないのでそんなことはないですが 子の数分親が表示されるのは正しい挙動です 逆に何をしたいのでしょうか?
cacao86

2020/04/03 06:57 編集

親id1, parent_id null 子id2, parent_id 1 子id3, parent_id 1 親id4, parent_id null 子id5, parent_id 4 上記のような形です。 $stmt=$db->prepare("select * from t_bbs as t1 left join t_bbs as t2 on t1.id = t2.parent_id where t1.deleted_at is null and t2.deleted_at is null "); $stmt->execute(); $res = $stmt->fetchAll(PDO::FETCH_ASSOC); print_r($res); このようにしたところ親が表示されなくなってしまいました。 親を飛ばして子だけが表示されています。 親も表示されると思ったのですが、どこに原因があるのでしょうか?
yambejp

2020/04/03 07:00

なにかで詰まったときには「select * 」はやめましょう 必要なカラムを列記してください joinする場合カラム名が競合する場合は別名をつけてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問