
3つのテーブルを結合(INNDR JOIN)している状態で重複するデータを無くしたいです。
[テーブルの種類とカラム内容]
posts(id,name)
categories_posts(id,post_id,category_id)
categories(id,name)
[現在作成しているSQL文]
SELECT * FROM categories_posts
INNER JOIN potsts ON categories_posts.post_id = posts.id
INNER JOIN categories ON categories_posts.category_id = categories.id;
1つのpostsに複数のcategoryが登録されている場合、postsのデータが重複して取り出されるので、重複するpostsを1つにまとめたい。
GROUP BY を使うというのはいろいろと調べてみてわかりました。自分で実験してみましたが、エラーになってしまいます。
1.postsとcategoriesの関連をcategories_postsというテーブルで管理しています。これらのテーブルをつなげるには上記に記載したSQL文で良いか?(データは取得できていますが記載するテーブルの順番など、これで良いのか?)
2.GROUP BYを使うときに GROUP BY posts.id か GROUP BY categories_posts.post.idのどちらを使えば良いか?また、上記のSQL文のどこに記載したら良いか?
ご回答よろしくお願い致します。
No.3ベストアンサー
- 回答日時:
>POSTに対応するカテゴリーを取り出す GROUP_CONCAT というものを見つけたのです
いや・・・#1でGROUP_CONCAT提示していますよね?
>GROUP_CONCATはGROUP BYと一緒に使ってWHEREをHAVING
ちょっと違うかも。この場合集計して抜き出すのではなく結合する際に絞り込むのが妥当。
JOINする際に条件節を追加します。具体的にはこう
SELECT p.id as pid,group_concat(c.name) as cname
FROM posts as p
INNER JOIN categories_posts as cp ON cp.post_id = p.id
AND cp.id IN (1,2,3)
INNER JOIN categories as c ON cp.category_id = c.id
GROUP BY pid;
ただし、普通に考えればcategoriesのidで絞り込むことはあっても
categories_postsのidで絞り込みをすることはありえない
categories_postsはpostsとcategoriesの組み合わせを決めるテーブルなので
そのidはprimary keyにあたるユニークを担保するものです。
検索の際にcategories_postsのidを意識することはまずないはずです。
yambejp様
何度も丁寧なご回答ありがとうございます。求める結果を得ることができました。
GROUP_CONCATの件、失礼いたしました。yambejp様からご提示いただいたソースで知ってウェブで情報を探したものでした。今回の件で3日間ほど苦戦しており、睡眠不足でボケておりました。申し訳ありません!
自分一人では解決にいつまでかかったことやら・・・
お力をお貸し頂き感謝です。
3つのテーブルの連結は初めてだったので苦労しましたが、だいぶ理解が進みました。
INNER JOIN はテーブルをつなぐだけに使用すると思っていたのですが、ここでもANDを使って絞り込んだりできるんですね。
No.2
- 回答日時:
うーん、categoriesからpostsを絞り込むイメージでしょうか?
表示するのがpostsのみでよければ一般にdistinctをつかいます
SELECT distinct p.id as pid,p.name as pname
FROM posts as p
INNER JOIN categories_posts as cp ON cp.post_id = p.id
INNER JOIN categories as c ON cp.category_id = c.id
No.1
- 回答日時:
>postsのデータが重複して取り出されるので、重複するpostsを1つにまとめたい。
SQL的に意味がわからないですね
posts.idでgroup by したら複数あるcategoriesデータはどう表示したいのでしょうか?
かりにcategoriesのnameだけ羅列してよいならこんな感じ?
なおつなげる順番はそれほど気にする必要はありませんが
今回のケースだと意味合い的にpostsからつなげた方がわかりやすいかもしれません
SELECT p.id as pid,p.name as pname,group_concat(c.name) as cname
FROM posts as p
INNER JOIN categories_posts as cp ON cp.post_id = p.id
INNER JOIN categories as c ON cp.category_id = c.id
group by pid
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- Ruby No route matches [GET] "/posts/5/destroy" 1 2022/03/24 13:00
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- PHP ランキングを表示する際の画像の大きさを固定することは可能でしょうか? <?php if ( has_ 1 2022/07/21 14:55
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
エラー 1068 (42000): 複数の主...
-
selectした大量データをinsert...
-
select文のwhere句に配列を入れ...
-
期間の重複を調べるSQL文につい...
-
バインド変数について
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
[MySQL] 3つのテーブルの結合で...
-
WordpressのContact form 7でzi...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
最小値をUPDATE
-
上位3位を求めるSQL文は?
-
ローカルルーターモードとは
-
updateを1行ずつ実行したい。
-
Postgreのupdateコマンドでエラー
-
ある条件の最大値+1を初番する...
-
少し前に放送されていたオムツ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
WordpressのContact form 7でzi...
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
クエリ表示と、ADOで抽出したレ...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
SQL Left Join で重複を排除す...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] UNIQUE制約の値を更新...
-
inner joinをすると数がおかし...
-
1テーブル&複数レコードの更新...
-
Access パラメータクエリをcsv...
-
期間の重複を調べるSQL文につい...
-
Unionした最後にGROUP BYを追加...
-
Updateの複数テーブル条件時のL...
おすすめ情報
yambejp様
早速のご回答ありがとうございます。
SQLを使う目的をしっかり説明すればよかったのですが、抜けておりました。
フォームのチェクボックスでカテゴリーをチェックボックス(複数可)で選んでそれに該当するpostsの一覧を表示させるというプログラムを作っておりました。
postsの一覧を表示させるのにあたり、postsが重複するものは1つだけ表示させるようにしたいと思いました。
このような目的でSQLを作る場合の方法を教えていただければと思います。
よろしくお願いいたします。
yambejp様
ご回答ありがとうございます。
上記のSQL文で求める結果となりました。カテゴリーの絞り込みで、WHERE categories_posts.category_id IN (1,2,3)を追加して、POSTに対応するカテゴリーを取り出す GROUP_CONCAT というものを見つけたのですが、これを使って下記のようなデータを作りたいと思います。
1 | カテゴリー名1 カテゴリー名2 |
2 | カテゴリー名2 カテゴリー名3 |
作成していただいたSQL文に どのようにGROUP_CONCATを加えれば良いか教えていただければと思います。
GROUP_CONCATはGROUP BYと一緒に使ってWHEREをHAVINGにするというところまではわかったのですが、うまく動かなくて困っております。