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

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

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

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

Q&A

解決済

2回答

721閲覧

MySQLで、あるカテゴリに紐づく記事と、どのカテゴリにも紐づかない記事を抽出するにはどうすれば良いですか

qwe001

総合スコア133

MySQL

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

0グッド

0クリップ

投稿2019/07/02 04:22

各テーブルには次のようなデータが格納されています

※記事マスタ SELECT id, name, alive FROM articles ORDER BY id DESC LIMIT 1; +----+--------+-------+ | id | name | alive | +----+--------+-------+ | 12 | 記事名 | 1 | +----+--------+-------+ ※記事に紐づくカテゴリ(中間テーブル) SELECT * FROM articles_genres LIMIT 5; +------------+----------+ | article_id | genre_id | +------------+----------+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 1 | | 12 | 1 | +------------+----------+ ※カテゴリマスタ SELECT id, name, code, alive FROM genres LIMIT 3; +----+----------+--------+-------+ | id | name | code | alive | +----+----------+--------+-------+ | 1 | イベント | events | 1 | | 2 | スポーツ | sports | 1 | | 3 | アニメ | anime | 1 | +----+----------+--------+-------+

この中から、ある複数のカテゴリに紐づく記事データと、
どのカテゴリにも紐づかない無所属の記事データを抽出しようと思っています。

あるカテゴリに紐づく記事は、次のようなSQL文で抽出できました

SELECT DISTINCT a.*, g.code AS genre_code, g.alive AS genre_alive FROM articles AS a LEFT JOIN articles_genres AS ag ON a.id = ag.article_id LEFT JOIN genres AS g ON ag.genre_id = g.id WHERE a.alive = 1 AND g.code IN ('events', 'sports') AND g.alive = 1 ORDER BY a.sort DESC ;

ですが、無所属の記事を抽出する方法が思いつきませんでした。
簡単に、それらのデータを抽出する方法はありますでしょうか?

あるいは、記事は最低1つ以上何らかのカテゴリに属するように縛るなどして
無所属というケースを発生しないようにしたほうがやりやすいでしょうか?
(または、「未分類」みたいなカテゴリを用意して、デフォルトはそれに紐づけるとか)

皆様のお知恵を貸してください。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

自己解決しました。次のSQL文により期待したレコードが取得できました。皆様解答ありがとうございました。

SELECT DISTINCT a.*, g.code AS genre_code, g.visible AS genre_visible FROM articles AS a LEFT JOIN articles_genres AS ag ON a.id = ag.article_id LEFT JOIN genres AS g ON ag.genre_id = g.id WHERE a.alive = 1 AND ( (g.code IN ('events', 'sports') AND g.alive = 1) OR (g.code IS NULL AND g.alive IS NULL) ) ORDER BY a.sort DESC ;

投稿2019/07/02 06:07

qwe001

総合スコア133

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

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

yambejp

2019/07/02 07:27

条件もよくわからないし、なんか違う感じがします きちんとsampleを提示しないと回答は難しいのは留意してください
guest

0

SQLで動作確認が実用な場合はCREATE TABLEと各テーブルで何件かINSERTと希望する問合せ結果を提示してください。

今回の質問は副問合せ で NOT EXISTS などを使います。

投稿2019/07/02 04:30

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問