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

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

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

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

1445閲覧

Laravel : 複数フィールドに対しての配列でのリクエスト

Hir19

総合スコア12

MySQL

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2020/01/30 07:36

編集2020/01/31 03:00

前提・実現したいこと

初めての投稿なので足りないことだらけになってしまうと思いますが...。

現在検索機能を作っていて、配列のリクエストが来た場合、
code1,code2,code3の3つのフィールドにAND検索を行いたい。

Sample Table

sample_idcode1code2code3is_deleted
1700500600false
2600100nullfalse
3200500nullfalse
4800500600false

上記のテーブルがあった場合、
リクエストが$codes = [100,200,300]としたら
検索結果として"sample_id = 2,3"のレコードを取得したい。

発生している問題

code1,code2,code3というフィールドにwhereInをかけているのですが、
条件に引っかからない場合スルーしてほしいのにひっかかり、
全件で返ってきてしまう(is_deletedのfalseが原因?)

該当のソースコード

php

1 $sample_query = Sample::query(); 2 $display = self::displayResultData(); 3 $mansion_query->where(self::SAMPLE_TABLE . '.is_deleted', false) 4 ->whereIn(self::SAMPLE_TABLE . '.code1', $codes) 5 ->whereIn(self::SAMPLE_TABLE . '.code2', $codes) 6 ->whereIn(self::SAMPLE_TABLE . '.code3', $codes) 7 ->select($display); 8 9    $result = $sample_query->get(); 10

※$displayはselectで出したいフィールド名が書いてあります。

試したこと

whereの文をコメントアウトし、WhereIn(self::SAMPLE_TABLE . '.code1', $codes, 'OR')
にするとほしい結果が取れるが、deleteしたレコード取得はしたくないため、
whereの文を消せない。

補足情報(FW/ツールのバージョンなど)

Laravel / Mysql

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

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

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

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

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

meshi_s

2020/01/30 08:42

toSqlなどでクエリは確認されましたか? また、該当のソースコードでの結果はどうなるのでしょうか? 「発生している問題」「試したこと」で、同一条件で結果が違うように見えるので。
Hir19

2020/01/31 01:35

toSqlを試しましたが、実際のコード(業務コードになるため)こちらに出せない感じになります。 ややこしくなってしまうため試したことを消します。
Hir19

2020/01/31 01:51

こちらのDB設計は私でなく既存のDBになるため第三正規化をしようと思いましたが、拒否され変更ができ無い為、code1,code2,code3にたいして検索をかけなければなりません....。
guest

回答3

0

ベストアンサー

まずはこうしてください。

投稿2020/01/30 13:01

yambejp

総合スコア114839

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

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

yambejp

2020/01/30 13:02

create table tbl(id int,num enum('1','2','3') not null,code int null,unique key(id,num)); insert into tbl values (1,'1',9), (1,'2',0), (1,'3',9), (2,'1',9), (2,'2',1), (2,'3',null), (3,'1',9), (3,'2',0), (3,'3',null); select id ,case when sum((code is null)*(num=1))=1 then null else sum(code*(num=1)) end as code1 ,case when sum((code is null)*(num=2))=1 then null else sum(code*(num=2)) end as code2 ,case when sum((code is null)*(num=3))=1 then null else sum(code*(num=3)) end as code3 from tbl group by id;
yambejp

2020/01/30 13:04

で、codeが(1,2,3)のどれかの場合 select distinct id from tbl where code in (1,2,3);
Hir19

2020/01/31 01:49

こちらのコードをsqlにて実行し新しくテーブル作成しましたが検索対象フィールドが足りないため、 (code1,code2,code3でなくcodeだけである) 私の求めている結果とは異なってしまいます。。。
yambejp

2020/01/31 02:48

> 検索対象フィールドが足りないため ちょっと意味不明 ちゃんとコピペして実行していただきましたか? code1~3が正しく表示されますよね? >私の求めている結果とは異なってしまいます。。。 当初命題にあったとおり、「2」が返ってくるとおもいます 途中で質問内容書き換えたと思いますが、それでも ほしい結果は得られると思いますが?
Hir19

2020/01/31 03:03

>ちょっと意味不明 ちゃんとコピペして実行していただきましたか? code1~3が正しく表示されますよね? phpmyadminで実行していたため他画面に遷移すると、 フィールドにid,num,codeと出力されていたため勘違いしていました... 今実行して遷移せずにそのままの画面にて 2コメ目のコードを実行したらid=2が取れました! しかし私の条件が足りなくこのコードに追加で、 is_deleted=falseである条件も追加しなくてはなりません...。 テーブル構造もただいま修正いたしました。
yambejp

2020/01/31 03:09

>is_deleted=falseである条件も追加 そうなると正規化の問題なのでマスターテーブルが必要になります サンプルでいうと sample_id,is_deleted 1,false 2,false 3,false 4,false というsample_idを主キー(もしくはユニークキー)にした テーブルで管理し、codeは別テーブルで管理をします なぜ、こんな面倒なことをするかというと code1-3を、同等の検索条件で検索する方針が示されているからです 効率的な検索をするには結果を想定したテーブルの設計が必要になります 逆に冗長なテーブルをつくればそれなりの検索しかできないということです
Hir19

2020/01/31 03:17

やはりテーブル設計が悪いですよね.... この場合だと一度CONCAT_WSを使用してcodesという新しいフィールドを作り、 カンマ区切りにして、そのあとforeachなど回して検索かける方法しかないですよね...。
yambejp

2020/01/31 03:19

いえ、効率が悪くていいなら code1 in (1,2,3) or code2 in(1,2,3) or code3 in(1,2,3) のような書き方で対処できます
Hir19

2020/01/31 03:42

DB設計者に言ってはいるんですけどどうしてもtable増やしたくないの一点張りでして... たしかにその場合だとほしいものが取得できるのですが、 is_deleted = falseの条件を付けたとたん全件取得になってしまいます。
yambejp

2020/01/31 03:52 編集

orとandを誤解しているのでは? where (code1 in (1,2,3) or code2 in(1,2,3) or code3 in(1,2,3)) and is_deleted = false 「どうしてもtable増やしたくない」は一番最初に条件提示することです もしそうなら、無駄な提案はしないですみました
Hir19

2020/01/31 04:02

yambejpさんのおかげで気づけました。 私の書き方が間違っていてcode1にもorを付けていたため全件になった感じです。 クエリビルダに慣れすぎてしまっているため、sql文をしっかり勉強しようと思います。 次回の質問から気を付けたいと思います アドバイスに感謝いたします。成長につながります。
guest

0

解決後のソースコード

php

1 $sample_query = Sample::query(); 2 $display = self::displayResultData(); 3 $mansion_query->where(self::SAMPLE_TABLE . '.is_deleted', false) 4 ->whereIn(self::SAMPLE_TABLE . '.code1', $codes) 5 ->whereIn(self::SAMPLE_TABLE . '.code2', $codes, 'OR') // 'OR'の追記 6 ->whereIn(self::SAMPLE_TABLE . '.code3', $codes, 'OR') // 'OR'の追記 7 ->select($display); 8 9    $result = $sample_query->get(); 10

一番最初のwhereIn(self::SAMPLE_TABLE . '.code1', $codes)に対しても'OR'を付けたため、
思った動きになりませんでした。

投稿2020/01/31 04:06

Hir19

総合スコア12

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

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

0

設計が微妙

code1/code2/code3
は第三正規化されていません。
mansionsテーブルとmantion_codesテーブルに分けで

$mantion_ids = MansionCode::whereIn('code', $codes)->get(['mansion_id'])->pluck('mansion_id') Mansion::whereIn('id', mantion_ids)->get()

とした方が効率的です

投稿2020/01/30 09:00

mikkame

総合スコア5036

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

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

Hir19

2020/01/31 01:34

設計が微妙なのは承知の上...といいますか、自分には変える権限がないためこのようなDB設計になっております...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問