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

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

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

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

Q&A

解決済

3回答

904閲覧

複数ある特徴のうち「一つだけ」合致するレコードを抽出したい

tksmso

総合スコア9

PHP

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

0グッド

0クリップ

投稿2018/08/03 02:13

編集2018/08/03 03:12

前提・実現したいこと

PHP+MySQL+Querybuilderでシステムを作っています。

特集ページを作るにあたり、「複数ある特徴の中から、特定の一つだけにチェックがかかっているレコードを抜き出したい」という要望が上がってきました。
この場合、どのような条件を指定すれば実現できるのでしょうか?

例)男性会員の「特徴」として以下のような項目リストがあった時に「やさしい」だけにチェックが入っている人を抽出するイメージです。
・やさしい ・楽しい ・話が面白い ・スポーツ好き ・料理好き ・オンオフはっきり

○やさしい
×やさしい 楽しい 料理好き
×やさしい オンオフはっきり

<テーブル構造(該当箇所のみ)>
| Field | Type | Null | Default |
|-----------------------+-------------------+------+-----------|
| entrant_feature | mediumtext | NO | NULL |

<補足情報>
重要な前提条件が抜けていたので補足します。
・社内DBの会員情報にある「特徴」欄にあらかじめチェックをしておく
・このデータをCSVエクスポートしてデータベースに入れる
・PHPフレームワークを使用して構築したサイトで情報を提供する
・通常はユーザー側で条件を設定して検索する形となる
・今回は、運営側であらかじめ設定した条件(上で挙げたイメージ)で抽出した特集ページを制作したい
というものになります。

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

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

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

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

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

maisumakun

2018/08/03 02:36

テーブル構造はどのようになっていますか?(それとも、決まっていませんか?)
terrace

2018/08/03 02:59

たぶん特徴のカラムだと思うのですけど、会員情報とはどのように紐づいているのですか?
guest

回答3

0

db構造から見直せるなら話は別ですが、質問で与えられた

システムを作っています

要望が上がってきました
○やさしい
×やさしい 楽しい 料理好き
×やさしい オンオフはっきり
<テーブル構造(該当箇所のみ)>
| Field | Type | Null | Default |
|-----------------------+-------------------+------+-----------|
| entrant_feature | mediumtext | NO | NULL |

といった記載から、稼動中のサービスで、かつ、entrant_featureに"○やさしい"と入っているのではないかと解釈しました。

SELECT * FROM table WHERE entrant_feature = '○やさしい';ではないのでしょうか。
また、性格別に複数カラムがあるとしたら、WHERE CONCAT(yasasi, tanosi, ryorisuki, onoffclear) = 'やさしい'とかでもできるような(NULLを許容してないように思うので、○とかしか入ってなくてもCONCAT(...) = "○×××"とかでもいいのかも)気がします

投稿2018/08/04 17:26

papinianus

総合スコア12705

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

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

0

ベストアンサー

DBから条件と合致するものをとりだしたいのか、入力が特定の条件なのか
わからない質問ですね。

たとえばこう

PHP

1<?PHP 2$c=filter_input(INPUT_GET,"c",FILTER_DEFAULT,FILTER_REQUIRE_ARRAY); 3if(is_array($c) and count($c)==1 and in_array("やさしい",$c)!==false){ 4 print "やさしいだけの男<br>"; 5} 6?> 7<form method="get"> 8<label><input type="checkbox" name="c[]" value="やさしい">やさしい</label><br> 9<label><input type="checkbox" name="c[]" value="楽しい">楽しい</label><br> 10<label><input type="checkbox" name="c[]" value="話が面白い">話が面白い</label><br> 11<label><input type="checkbox" name="c[]" value="スポーツ好き">スポーツ好き</label><br> 12<label><input type="checkbox" name="c[]" value="料理好き">料理好き</label><br> 13<label><input type="checkbox" name="c[]" value="オンオフはっきり">オンオフはっきり</label><br> 14<input type="submit" value="check"> 15</form>

mysql側の処理

データの持ち方はこうしてください

SQL

1create table user (uid int primary key ,uname varchar(30)); 2insert into user values(1,'佐藤'),(2,'鈴木'),(3,'田中'),(4,'中村'); 3 4create table tokucho(tid int primary key,tname varchar(30)); 5insert into tokucho values(1,'やさしい'),(2,'楽しい'),(3,'話が面白い'),(4,'スポーツ好き'),(5,'料理好き'),(6,'オンオフはっきり'); 6 7create table user_tokucho (utid int primary key,uid int not null,tid int not null,unique(uid,tid)); 8insert into user_tokucho values 9(1,1,1),(2,1,2),(3,2,2),(4,2,3),(5,2,4),(6,2,5),(7,2,6),(8,3,1),(9,4,2);

そうすると個人ごとの特徴の一覧がこうなります

SQL

1select t1.uname,group_concat(t3.tname) as tnames 2from user as t1 3inner join user_tokucho as t2 on t1.uid=t2.uid 4inner join tokucho as t3 on t2.tid=t3.tid 5group by uname

特徴が「やさしい」だけなのでこれを絞り込みます

SQL

1select t1.uname,group_concat(t3.tname) as tnames 2from user as t1 3inner join user_tokucho as t2 on t1.uid=t2.uid 4inner join tokucho as t3 on t2.tid=t3.tid 5group by uname 6having tnames='やさしい'

ちゃんとやるならこう

SQL

1select * from user as t1 where exists( 2select 1 from user_tokucho as t2 3group by uid 4having count(*)=1 5and sum(tid=(select tid from tokucho where tname='やさしい'))=1 6and uid=t1.uid)

投稿2018/08/03 03:00

編集2018/08/03 04:41
yambejp

総合スコア114837

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

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

0

イメージ説明
条件はこれで合っていますか?

どのようなフォーマットになっているかわからないので一概には言えませんが、
指定項目以外に否定条件を入れるしかなさそうに思えます。

PHPもMYSQLも専門外なので
都合のよい命令があったらすみません。

投稿2018/08/03 02:37

torisan

総合スコア678

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

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

tksmso

2018/08/03 02:44

ありがとうございます。 条件としてはまさにこれですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問