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

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

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

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

PHP

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

Q&A

解決済

3回答

169閲覧

MySQLでカラムのフィールドの値を検索して数えたい。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/07/10 11:06

データベースquestionnaireのpostdataテーブルの中のhobbyカラム内に,区切りで音楽鑑賞…etc入っていて、
hobbyその他の値で自由なテキストが配列でimplodeで合体しています。

例 音楽鑑賞,ドライブ,旅行,寝ること

みたいな感じで入っています。
で以下の文みたいな感じで、その他の部分がある場合、フィールド数をカウントしたいのです。

php

1 2try{ 3$dsn = "mysql:dbname=questionnaire;host=localhost;charset=utf8"; 4$dbh = new PDO($dsn, 'root', '', array( 5PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 6PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 7PDO::ATTR_EMULATE_PREPARES => false, 8)); 9 10$prepare = $dbh->prepare('SELECT COUNT(id) AS id_all, 11 SUM(CASE WHEN gender = "男性" THEN 1 ELSE 0 END) AS male_count, 12 SUM(CASE WHEN gender = "女性" THEN 1 ELSE 0 END) AS female_count, 13 COUNT(hobby) AS hobby_all, 14 SUM(hobby LIKE "%音楽鑑賞%") AS "音楽鑑賞", 15 SUM(hobby LIKE "%映画鑑賞%") AS "映画鑑賞", 16 SUM(hobby LIKE "%ドライブ%") AS "ドライブ", 17 SUM(hobby LIKE "%旅行%") AS "旅行", 18 SUM(hobby LIKE "^(?!.*[\x01-\x7E]).*(?=[音楽鑑賞|映画鑑賞|ドライブ|旅行]).*$") AS "その他" 19 FROM postdata 20'); 21$prepare->execute(); 22$result = $prepare->fetch(); 23 24} catch(PDOException $e){ 25 26 header('Content-type: text/plain; charset=UTF-8, true, 500'); 27 exit($e->getMessage()); 28} 29 30header('Content-Type: text/html; charset=utf-8'); 31 32?>

適当にパターンマッチングしたかったのですが、"その他"の所がエラーになります。
LIKE文でそれぞれカウントできたのはいいのですが、どうしても"その他"の部分が難しいです。
どうしても文字列を含んでいるとそれ以降を処理してないかんじで……
fetchAll使ったほうがいいとか思ったのですが、同じような結果にするのに、配列扱うの難しくてSELECT文でやってます。
もし何か間違ってたらどうぞご指摘ください。

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

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

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

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

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

guest

回答3

0

その他データを保存する時に、その他データが!empty()とかisset()の判定を通った後で、
"【これがあるって事は、このカラムにその他データがあるって事だよ!絶対その他データあるって!!間違いない!!!いや、多分あるかな。。。無かったらごめんニャンニャン】"を付けてからテーブルに保存しておけば、

SUM(hobby LIKE "%【これがあるって事は、このカラムにその他データがあるって事だよ!絶対その他データあるって!!間違いない!!!いや、多分あるかな。。。無かったらごめんニャンニャン】%") AS "その他"

で行けるんじゃないですかね。

投稿2019/07/11 00:12

編集2019/07/11 00:16
yukikp

総合スコア797

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

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

退会済みユーザー

退会済みユーザー

2019/07/11 07:06

確かに、私の中にその発想はなかったです。
guest

0

MySQLで正規表現マッチングを行う場合、LIKEではなく列名 REGEXP パターンあるいは列名 RLIKE パターンと書きます(MySQL 5.6リファレンス)。

投稿2019/07/10 12:17

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2019/07/11 07:55

そうだったんですか…… 知りませんでした……
guest

0

ベストアンサー

MySQLのLIKEや正規表現でやることではないでしょうね
レコードの主キーごとに1hobbyずつレコード登録するように変更しない限り
そうとうめんどうで非効率な処理になりそうです

投稿2019/07/10 12:14

yambejp

総合スコア114784

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

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

退会済みユーザー

退会済みユーザー

2019/07/11 07:01

1投稿別に1ROE追加して、趣味カラム別に1か0を入れていく感じですか? それはわかりやすいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問