![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
mysqlで2つのテーブルをINNER JOINしてデータを抽出したいのですが、うまくデータが抽出できないのでSQL文の書き方を教えてください。
「テーブルの構成」
[postテーブル]
id (int) auto_increment
name (varchar)
[categoryテーブル]
id (int) auto_increment
post_id(int)
name (varchar)
「入力されているデータ」
[postテーブル]
id| name
1 | 自由課題
2 | 夏休みの宿題
3 | 研究
[categoryテーブル]
id| post_id|name
1 | 1 |国語
2 | 1 |算数
3 | 1 |理科
4 | 2 |国語
5 | 2 |英語
6 | 2 |社会
7 | 3 |理科
8 | 3 |英語
9 | 3 |国語
「抽出したいデータ」
postテーブルとカテゴリーテーブルを
SELECT * FROM post INNER JOIN category ON post.id = category.post_id
のようにINNER JOINして、categoryテーブルのnameに国語と理科の両方が含まれるpostテーブルのidとnameを抽出したいです。
上記のデータだとpostテーブルの「id=1,name=自由課題」と「id=3,name=研究」という結果が得られれば良いです。
SELECT * FROM post INNER JOIN category ON post.id = category.post_id where category.name='理科'
というcategoryのnameを1つだけ指定した場合は抽出できるのですが、
SELECT * FROM post INNER JOIN category ON post.id = category.post_id where category.name='理科' and category.name='国語'
と指定した場合 データが抽出できず空の結果が返ってきてしまいます。
2つのテーブルのINNER JOINという問題以前に 一つのカラムで「国語」かつ「理科」というand検索の方法がわかっていないのが問題のような気がしています。
ご回答よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
>2の意味は「国語」「理科」という2つの語句で検索しているので2という数字を指定していると理解してよろしいのでしょうか?
ちゃんと説明した方がよかったですね。
ご理解の通り、2科目で検索しているという意味の「2」です。
ついでに「 count(distinct c.name)」でdistinctを使っている理由は
仮にcategoryテーブルで10番目のデータが「10 | 3 |国語」と9番目とかぶるような場合
count(c.name)だけだと数値が3になるからです
ユニークなカウントをして数値と合致させる必要があります
yambejp様
ご回答ありがとうございます。
「 count(distinct c.name)」の説明までしていただき感謝です。
ユニークなカウントに注意する必要があるんですね。
group by や having はまだあまり使いなれていないので、今後勉強していきたいと思います。
今後ともよろしくお願い致します。
No.1
- 回答日時:
select p.id,p.name from post as p inner join category as c on p.id = c.post_id
and c.name in ('国語','理科')
group by id
having count(distinct c.name)=2
yambejp様
ご回答ありがとうございます。
教えていただいたSQL文を実行したところ、求める結果を得ることができました。
SQLの4行目「having count(distinct c.name)=2」の2の意味は「国語」「理科」という2つの語句で検索しているので2という数字を指定していると理解してよろしいのでしょうか?
この数字の意味がわからないので教えていただければと思います。
よろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle SQL update方法 2 2022/06/22 14:07
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクラPC版のコマンドで効率...
-
副問合せの書き方について
-
SQLについての質問
-
貝を買って中から死にかけのカ...
-
インスタの名前でかっこいいと...
-
MYSQL PERL からの抽出について
-
一つ前のレコードの値と減算し...
-
クエリ表示と、ADOで抽出したレ...
-
SQL文で、一部一致した列だけ抽出
-
主キーレコードを削除する場合
-
別テーブルからSELECTした値を...
-
複数JOINしているとCOUNTが正し...
-
1テーブル&複数レコードの更新...
-
mysqlで2つのテーブルを使った...
-
HAVING count()で重複したデー...
-
ダイソンのサイクロン掃除機「...
-
別のDB(Table)からの複数行の...
-
MySQL UPDATE SETが失敗なのに...
-
上位3位を求めるSQL文は?
-
ウイルスバスター2005への...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
VIEWの元のテーブルのindexって...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
sqlで、600行あるテーブルを100...
-
ある条件の最大値+1を初番する...
-
Unionした最後にGROUP BYを追加...
-
inner joinをすると数がおかし...
-
期間の重複を調べるSQL文につい...
-
クエリ表示と、ADOで抽出したレ...
-
Access パラメータクエリをcsv...
-
PL/SQLの変数について
-
MySQLのDATE型カラム値がNULLの...
-
php+mysqlで複数選択削除について
-
上位3位を求めるSQL文は?
おすすめ情報