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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

650閲覧

リレーション先のカラムの値が特定のものだけのレコードを取得したい。

h_e_llo

総合スコア13

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2023/04/19 13:41

実現したいこと

Laravelでwherehasメソッドでタグを絞り込んで記事を取得しました。
wherehasメソッド内のwhereIn句でtag_idが1,3のものを絞り込むと、記事idが1,3,4の記事が取得されました。
しかし、記事のタグのidが1,3のものだけを取得したい場合(以下のテーブルの場合、記事idが3,4の記事)はどうすれば良いのでしょうか。

前提

articlesテーブル

idname
1a
2b
3c
4d

中間テーブル

article_idtag_id
12
13
22
31
33
41

tagsテーブル

idname
1A
2B
3C

該当のソースコード

php

1// $tags = [1,3] 2$query->wherehas('tags',function ($q) use ($tags) { 3 $q->whereIn('id', $tags); 4});

結果

id(article)
1
3
4

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

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

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

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

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

guest

回答2

0

自己解決

SQL

1select * from `article_tag` where `article_id` not in ( 2 select `article_id` from `article_tag` where `tag_id` not in (1,3) 3);

こんな感じのSQLで行けました。
まだlaravelで試してませんがwhereNotInメソッドがあるので行けると思います。

投稿2023/04/20 08:47

h_e_llo

総合スコア13

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

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

0

どういうことでしょう?
中間テーブルでtag_idが1か3を選べばarticle_idが1,3,3,4がヒットします
article_idが1,3だけ抽出したいとなるとなんらかの追加条件が必要になります

追記

ちょっと勘違いしていました
tag_idが1または3またはその両方を含んで、1,3以外を含まないということですね

SQL

1select article_id 2from tbl 3group by article_id 4having sum(tag_id in(1,3))>0 5and sum(tag_id not in(1,3))=0 6

投稿2023/04/20 00:19

編集2023/04/20 08:46
yambejp

総合スコア117674

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

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

h_e_llo

2023/04/20 08:26

whereinの挙動自体は理解してます。 article_idと結びついているtag_idが1,3のものだけを抽出したいとき(例示したテーブルだと、article_id:1はtag_id:2を持っているため、抽出から外したい)、どのような考え方でクエリを組めばいいのかが分からなくて本質問をしました。
yambejp

2023/04/20 08:48

勘違いしていたので追記しておきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問