table
post_id | category_id
1 | 4
2 | 2
3 | 1
4 | 2
5 | 3
1 | 3
2 | 6
3 | 3
4 | 4
5 | 4
上記のようなテーブル構成になっております。
ここからcategory_idが 3 と 4 を持つpost_idを取得したい。
上記の場合はpost_idが1 5を抽出したいです。
select post_id from table where category_id = 3 and category_id = 4;
とやると何も取得できず、原因はcategory_idが1つの値しかもっていないからだと思うのですが、こう言った場合どのように書けばいいのかご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ミックさんのCASE式のススメ
http://www.geocities.jp/mickindex/database/db_case.html
を見ながら、Oracle12cで作ってみました :-)
sql
1with t(post_id,category_id) as( 2select 1,4 from dual union 3select 2,2 from dual union 4select 3,1 from dual union 5select 4,2 from dual union 6select 5,3 from dual union 7select 1,3 from dual union 8select 2,6 from dual union 9select 3,3 from dual union 10select 4,4 from dual union 11select 5,4 from dual) 12select post_id 13 from t 14group by post_id 15having sum(case category_id when 3 then 1 else 0 end) >=1 16 and sum(case category_id when 4 then 1 else 0 end) >=1 17order by post_id; 18 19 POST_ID 20--------- 21 1 22 5 23
投稿2016/08/21 03:01
総合スコア1147
0
既に終わっていますが、INTERSECT
を使う方法もあります。
SQL
1SELECT 2 post_id 3FROM 4 table1 5WHERE 6 category_id=3 7INTERSECT 8SELECT 9 post_id 10FROM 11 table1 12WHERE 13 category_id=4
投稿2016/08/18 08:38
総合スコア2019
0
ベストアンサー
category_id=3 の結果と category_id=4 の結果を内部結合することで希望の結果が取得できそうです。
未検証ですが以下のようなクエリはいかがでしょうか。
(文法ミスがあるかもしれませんので、考え方を参考にしてみてください。)
SQL
1select X.post_id, X.category_id, Y.category_id 2from 3 (select * from table where category_id = 3) AS X 4inner join 5 (select * from table where category_id = 4) AS Y 6on 7 X.post_id = Y.post_id
投稿2016/08/18 08:08
総合スコア2335
0
とりあえず質問に書かれているテーブルだと正常な結果を得られました。
sql
1select distinct(post_id) from table where post_id in (select distinct(post_id) from table where category_id=3) and category_id=4;
投稿2016/08/18 08:24
編集2016/08/18 08:28総合スコア16731
0
JOINを使って同じテーブルを突き合わせて判断すればできます。
SQL
1SELECT t1.post_id 2FROM table t1 3LEFT OUTER JOIN table t2 ON t1.post_id = t2.post_id 4WHERE t1.category_id = 3 AND t2.category_id = 4;
同じテーブル同士なのでOR文やDISTINCTは不要でしたね。
投稿2016/08/18 08:20
編集2016/08/18 08:23総合スコア3579
0
上記のSQLでは「category_idが3かつ4のレコード」を抽出していますが、それだと該当するレコードがないので、「category_idが3または4のレコード」という意味で、以下で行けるのではないでしょうか。
※post_idは一意にしています。
select distinct post_id from table where (category_id = 3 or category_id = 4);
投稿2016/08/18 08:03
総合スコア45
0
category_idが 3 と 4 を持つpost_idを取得
だけであれば
select * from table where category_id = 3 or category_id = 4
さらにpost_id が1と5のデータを抽出するのであれば
select * from table where (category_id = 3 or category_id = 4) and (post_id = 1 or post_id = 5)
でよいのではないでしょうか。
投稿2016/08/18 07:59
編集2016/08/18 08:00総合スコア2021
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/21 03:20