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

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

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

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

Q&A

解決済

2回答

671閲覧

1つのテーブルから、SELECTで取得したIDを、さらにNOT INで絞り込みたい

Zapdos_1060

総合スコア19

SQL

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

0グッド

0クリップ

投稿2018/10/30 03:09

編集2018/10/30 04:02

実現したいこと

抽象的な説明が難しいので具体的な説明で書きます。
ワードプレスで「wp_postmeta」に対して、例えば「カテゴリーが旅行」の記事の中で「サムネイルが設定されていない記事」を取得したいです。

meta_key = 'category' and meta_value = 'trip'
この条件で旅行記事のみの取得はできますが、そこからサムネイルが設定されていない記事に絞り込む方法がわかりません。

自分で調べ、下記のコードで実行してみましたがうまくいきませんでした。
また、そもそもNOT INではなく別の方法があればそれも提示していただけるとありがたいです。

sql

1select * 2from wp_postmeta 3where meta_key = '_thumbnail_id' 4not in( 5 select post_id 6 from wp_postmeta 7 where meta_key = 'category' and meta_value = 'trip' 8)

補足情報(FW/ツールのバージョンなど)

データベースはMySQLです。

追記

サムネイルが存在するかどうかを確認する方法についての追記です

サムネイルが存在する場合は
テーブル:wp_postmeta
|meta_id|post_id|meta_key|meta_value|
|:--|:--:|--:|
|0001|1000|category|trip|
|0002|1000|_thumbnail_id|12345|

のような指定のされ方をしています。

サムネイルが存在しない場合はそもそもpost_idに対応するmeta_key = '_thumbnail_id'のデータが存在していません。
なので、meta_key = '_thumbnail_id' and meta_value = NULLという条件とすると、meta_key = '_thumbnail_id'となるデータが存在しないためNULL判定することができません。

なので、「meta_key = '_thumbnail_id'となるデータが存在しないこと」を条件としたいと考えています。

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

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

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

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

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

sazi

2018/10/30 03:30 編集

「サムネイルが設定されていない」と判断する条件は何でしょう? 例えば、特定の項目に値が設定されていないとか
Zapdos_1060

2018/10/30 03:34

質問について追記させていただきました。meta_key = '_thumbnail_id'となるデータが存在しない場合が「サムネイルが存在しない場合」としています。
sazi

2018/10/30 03:40

wp_postmetaがサムネイルを管理するものと解釈すると、「サムネイルが設定されていない記事」とは、wp_postmetaと関連付けられた別テーブルではないですか?
sazi

2018/10/30 03:51 編集

あとデータベースについてはタグの方が良いですね
Zapdos_1060

2018/10/30 03:56

これはワードプレスの仕様の話になりますが、記事のタイトル・本文の情報が`wp_post`テーブルに記録されています。このそれぞれのIDは`post_id`とされ、前述した2項目以外の情報は全て`wp_postmeta`に`post_id`と紐付ける形で記録されています。この状況だと、目的の達成に必要な情報は「カテゴリー・サムネイルの有無・記事番号(post_id)」の3つとなりますが、全ては`wp_postmeta`テーブルに記録された情報のためこの1つのテーブル内で完結させることができると考えています。
sazi

2018/10/30 04:02 編集

サムネイルがあるものがwp_postmetaに記録されるのであって、記録が無いものを探そうとしてるんだからwp_postmetaだけでは完結しないのではないですか?
sazi

2018/10/30 04:04

存在しないものは条件にできないとご自身で仰っているのではないですか?
Zapdos_1060

2018/10/30 04:09

追記したデータベースの内容が参考になれば幸いですが、カテゴリーは必ず設定されるためwp_postmetaには全ての記事のカテゴリー情報が存在しています。記録が存在しないものを探そうとしているのはpost_idをもとに_thumbnail_idが存在しないものを探すための方策について考えています。なにか問題がありましたか・・・?
sazi

2018/10/30 04:23

post_idはwp_postのキーだと思いますが、wp_postmetaにサムネルが無くてそれが登録されていないのにwp_postmetaだけでそのpost_idを探したいと言われているように解釈されるのですが
sazi

2018/10/30 04:25 編集

meta_key='category', meta_value='trip'は必ず登録されている前提なら理解はできますが
退会済みユーザー

退会済みユーザー

2018/10/30 04:40 編集

コメントを撤回します。
sazi

2018/10/30 04:40 編集

(私が)ワードプレスの仕様が理解できていれば、細かく聞く必要はなかったように思います。
guest

回答2

0

ベストアンサー

「カテゴリーが旅行」で登録されているもののうち「サムネイルが設定されていない」記事

SQL

1select post_id 2from wp_postmeta mt 3where meta_key = 'category' and meta_value='trip' 4 and not exists( 5 select 1 from wp_postmeta where post_id=mt.post_id and meta_key='_thumbnail_id' 6 )

投稿2018/10/30 04:36

編集2018/10/30 04:38
sazi

総合スコア25138

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

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

Zapdos_1060

2018/10/30 05:34

ありがとうございます。無事目当てのデータを取り出すことができました。取り出したデータに名前をつけることができるんですね。 ただ1つだけわからない点がありまして、not exists句の中の「select 1」は、どうして1なのでしょうか? 自分でも調べてみたのですが、明確に記述されている記事等を見つけることができませんでした。
Zapdos_1060

2018/10/30 05:38

自己解決しました! https://ameblo.jp/figarochocolat/entry-11550211590.html 「該当するデータが存在するかを判別できれば良いから、データを取り出すよりも速く処理が終わるselect 1を設定した」という記述を見つけました。 教えていただいてありがとうございました!頑張ってSQLの知識をつけていきます!
sazi

2018/10/30 05:45

select 1については検索された通りです。 下手に項目指定すると、実行計画が悪くなる可能性もあるし、固定の値であれば何でも良いんです。 1を使うのは、existsの判定は結局、True/Falseなので(False,True)=(0,0以外※1,-1など)ということから1を使用するのが定型化したというところです。
sazi

2018/10/30 05:49

>取り出したデータに名前をつけることができるんですね。 エイリアス(=別名)と言います。 提示したSQLのExistsの部分は「相関問い合わせ」というもので、今回は主で参照しているものと同じテーブルに対しての相関なので、どちらかにエイリアスを付ける必要がありました。
Zapdos_1060

2018/10/30 06:44

詳しい説明ありがとうございます。 用語などの検索の際に役立つ知識まで教えていただいて、とても勉強になりました!
guest

0

where ... and not <カラム名> = null みたいな感じでいいのでは?

投稿2018/10/30 03:18

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Zapdos_1060

2018/10/30 03:29

説明が足りずすみません。 サムネイルが存在する場合は `post_id = 1000(記事番号) meta_key = '_thumbnail_id' meta_value = 2000(画像番号)` のような指定のされ方をしています。 ただ、サムネイルが存在しない場合はそもそも`post_id`に対応する`meta_key = '_thumbnail_id'`のデータが存在していないのです。 なので、`meta_key = '_thumbnail_id' and meta_value = NULL`という条件とすると、`meta_key = '_thumbnail_id'`となるデータが存在しないためNULL判定できないのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問