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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

Q&A

解決済

7回答

1814閲覧

SQL文 特定の数値を持つ重複した値を取得したい

Hello

総合スコア25

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

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

1グッド

1クリップ

投稿2016/08/18 07:54

編集2016/08/18 07:57

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ページで確認できます。

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

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

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

guest

回答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

AketiJyuuzou

総合スコア1147

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

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

Hello

2016/08/21 03:20

ご回答ありがとうございます。 勉強させていただきます。
guest

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

SQL Fiddleで動くサンプル

投稿2016/08/18 08:38

alg

総合スコア2019

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

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

Hello

2016/08/18 09:39

algさん ご回答ありがとうございます。 みなさまからご丁寧に回答いただいているにも関わらず、結果が得られたからといって早急に終わらせてしまいました。 勉強させていただきます。
PineMatsu

2016/08/18 09:48

INTERSECT(積集合)か、データーベースらしくていいですね。SQLiteでも使えるんですね。
guest

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

takyafumin

総合スコア2335

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

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

Hello

2016/08/18 08:15

ありがとうございます! 思い通りの結果が返ってきました。
guest

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
fuzzball

総合スコア16731

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

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

fuzzball

2016/08/18 08:25 編集

すでに終わってたw
Hello

2016/08/18 09:41

fuzzballさん ご回答ありがとうございます。 期待した結果が得られたからといって、早急に閉じてしまって追求しない。。。初心者の悪い癖ですねw 勉強させていただきます。 誠にありがとうございます。
guest

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
PineMatsu

総合スコア3579

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

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

PineMatsu

2016/08/18 08:28

終わってたか・・・ww でも、OUTER JOINを使ったサンプルということで(笑)
Hello

2016/08/18 09:43

PineMatsuさん ご回答ありがとうございます。 1つの要件でも様々なやり方があるのですね。 勉強させていただきます。 ありがとうございました。
guest

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

SSL_beginner01

総合スコア45

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

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

Hello

2016/08/18 08:15

ご回答ありがとうございます。 いただいた方法ですと or 条件になり、今回の要件に当てはまらないんです。。。 テーブル構成が良くないですよね〜。何となく取れないのではないかと感じでおります。。 ご回答いただきまして誠にありがとうございます。
guest

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
s.t.

総合スコア2021

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

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

Hello

2016/08/18 08:07

ご回答ありがとうございます。 教えていただいたやり方ですと、数値が取得できませんでした。 select * from table where category_id = 3 or category_id = 4 おそらく table post_id | category_id 1 | 3 4 2 | 1 2 3 | 3 4 といったようにcategory_idに複数数値がないといけないのではないかと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問