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

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

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

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

PHP

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

Q&A

解決済

1回答

2478閲覧

php mysql 論理削除について

nippa23

総合スコア10

MySQL

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

PHP

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

0グッド

0クリップ

投稿2020/04/14 11:01

現在、PHPとmysqlの連携に関して勉強している者です。
恐れ入りますが、論理削除に関して質問させて頂けますでしょうか。

[質問内容]
親レコードを論理削除した後、論理削除されていないデータをすべて取り出したいです。
ただ、論理削除された親レコードに属している子レコードは、親レコードに従い取り出さないようにしたいです。
(※すみませんが子レコードは、論理削除されていない状態のままでお願い致します。)

[mysqlの前提] データベース名:test_db テーブル名:t_bbs フィールド : id int(11)   name varchar(255)   body varchar(255)   parent_id int(11)  ※parent_idがnullの場合は親レコードとする。 parent_idに1が入っていれば、id=1の子レコードとする。   deleted_at datetime テーブルの構造 +----+-----------------------------+--------------------------------------+-----------+---------------------+ | id | name | body | parent_id | deleted_at | +----+-----------------------------+--------------------------------------+-----------+---------------------+ | 1 | Fujiwara | Fujiwara Bunta desu | NULL | 2020-04-14 18:46:49 | | 2 | Fujiwara | Fujiwara Takumi desu | 1 | NULL | | 3 | Takahashi | Takahashi Ryosuke desu | NULL | NULL | | 4 | Takeuchi | Takeuchi Itsuki desu | NULL | NULL | +----+-----------------------------+--------------------------------------+-----------+---------------------+

[説明]
test_dbというデータベースに、
t_bbsというテーブルを作成致しました。

t_bbsのテーブルの中に、
id、name、body、parent_id、deleted_atという5つのフィールドがございます。

親レコードの見分け方は、
parent_idというフィールドがNULLであれば、親レコードとさせていただきます。
逆に、parent_idに 1 が入っていれば、id = 1 の子レコードとさせていただきます。
(parent_idに 2が入ってれば、 id = 2 の子レコードとなります。)

論理削除の見分け方は、
deleted_atというフィールドを設けており
こちらに値が入っていれば論理削除されている状態。
(今回であれば、id=1のみ論理削除されています。)

deleted_atフィールドの値がnullであれば、論理削除されていない状態とさせていただきます。

[再度、質問内容に戻りますが、]
親レコード(id = 1)を論理削除を行い、論理削除されていないデータをすべて取り出したいです。(つまり、id=3、4のみ取り出したいです。)
ただ、論理削除された親レコードにに属している、子レコードは取り出さないようにしたいです。(id=2は id=1の子レコードのため取り出さないです。)
つまり、id=1と2は取り出さず、id=3と4のみ取り出しく存じます。

どのような取り出し方を行えばよろしいでしょうか。
初歩的な質問となってしまい大変恐れ入りますが、ご回答頂けますと幸いでございます。

また、分かりづらい点などございましたら
お気軽にご指摘頂けますと幸いでございます。

何卒どうぞよろしくお願い致します。

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

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

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

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

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

m.ts10806

2020/04/14 11:32

まずご自身で思ったようにSQLから組んでみてください。 ほぼ、作業依頼になってます。
nippa23

2020/04/16 15:59

上記、大変失礼いたしました。 ご指摘くださりどうもありがとうございます。
m.ts10806

2020/04/16 21:25

質問は編集できますので。
guest

回答1

0

ベストアンサー

「親レコード(未削除のもの)を取得」と「子レコード(親レコードが未削除のもの)を取得)」を別々に行い、その結果を UNION ALL で結合すれば目的のものがとれると思います。

sql

1 2-- 親レコード(未削除のもの)を取得 3SELECT * FROM t_bbs 4WHERE 5 parent_id IS NULL 6 AND 7 deleted_at IS NULL 8 9-- 結合 10UNION ALL 11 12-- 子レコード(親レコードが未削除のもの)を取得) 13SELECT * FROM t_bbs AS child 14WHERE 15 EXISTS ( 16 SELECT * FROM t_bbs AS parent 17 WHERE 18 child.parent_id = parent.id 19 AND 20 parent.deleted_at IS NULL 21 )

解説

親レコード取得

  • 親レコードを取得するほうは、ほぼ解説不要かと思います(取得条件に「親レコードであること(parent_idがNULLであること)」と「削除されていないこと(deleted_atがNULLであること)」を指定するだけ)。

子レコード取得

  • 子レコードを取得するほうは、EXISTSを使います(EXISTS=指定した条件のレコードが存在するか、を示すもの。詳細は「mysql exists」で検索すると、いろいろHITします)。

  • 同じテーブルどうしをEXISTSするのですが、同じテーブル同士だと、カラムを指定するときに、どちらのテーブルを指すのかわからなくなるため、テーブルに、ASを使って別名をつけています(childとかparentというのは単なる別名です。役割をわかりやすくするためにこの名前にしましたが、別にaとかbでも動作上は問題ありません)。

追伸1:

初歩的な質問となってしまい大変恐れ入りますが、

一見簡単そうですが、こちら、あまり初歩的な内容ではないと思います。

追伸2:

取得する度に、こういう複雑なSQLを書かなくてはならなくなりますので(複雑なだけでなく実行速度も遅いです)、できれば、親レコードを削除する時に、子レコードについても削除するようにしたほうが良いと思います。

投稿2020/04/15 05:23

nak

総合スコア696

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

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

nippa23

2020/05/06 16:04 編集

nak様 ご回答くださり誠にありがとうございます!! 上記、実行したところ取得したい情報が受け取れました! 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問