みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPで同じDBから違う内容でカウントを繰り返す

各クラスに、田中・鈴木・佐藤が何人いるかMySQLのデータベースからカウントし
HTMLでテーブルを組んで、それぞれの人数を表示しています。

【カウント用PHP】
$cnt_A = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%田中%' AND class LIKE '%1組%'";
$cnt_recordSet_A = mysql_query($cnt_A);
$table_A = mysql_fetch_assoc($cnt_recordSet_A);
$A = number_format($table_A['cnt_A']);

$cnt_B = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%1組%'";
$cnt_recordSet_B = mysql_query($cnt_B);
$table_B = mysql_fetch_Bssoc($cnt_recordSet_B);
$B = number_format($table_B['cnt_B']);

$cnt_C = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%佐藤%' AND class LIKE '%1組%'";
$cnt_recordSet_C = mysql_query($cnt_C);
$table_C = mysql_fetch_Cssoc($cnt_recordSet_C);
$C = number_format($table_C['cnt_C']);

$cnt_D = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%田中%' AND class LIKE '%2組%'";
$cnt_recordSet_D = mysql_query($cnt_D);
$table_D = mysql_fetch_Dssoc($cnt_recordSet_D);
$D = number_format($table_D['cnt_D']);

$cnt_E = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%2組%'";
$cnt_recordSet_E = mysql_query($cnt_E);
$table_E = mysql_fetch_Essoc($cnt_recordSet_E);
$E = number_format($table_E['cnt_E']);

$cnt_F = "SELECT COUNT(*) AS cnt FROM table WHERE name LIKE '%佐藤%' AND class LIKE '%2組%'";
$cnt_recordSet_F = mysql_query($cnt_F);
$table_F = mysql_fetch_Fssoc($cnt_recordSet_F);
$F = number_format($table_F['cnt_F']);



【表示用PHP】
+------+-----------------+-------------------+
|----|1組          |2組           |
+------+-----------------+-------------------+
|田中|<?PHP print $A ?>人|<?PHP print $D ?>人|
+------+-----------------+-------------------+
|鈴木|<?PHP print $B ?>人|<?PHP print $E ?>人|
+------+-----------------+-------------------+
|佐藤|<?PHP print $C ?>人|<?PHP print $F ?>人|
+------+-----------------+-------------------+
        (テーブルはHTMLで作成、コードは略します・・・)



今後、各テーブルにさらに
 ・男子の人数/女子の人数
表示例:
+------+---------------------------------------------------------------------+......
|田中|<?PHP print $A ?>人(男子:<?PHP print $A_boy ?>/女子:<?PHP print $A_girl ?>)|......
+------+---------------------------------------------------------------------+......
というように増やしていこう思ったのですが、
【カウント用PHP】がすごく長くなってしまって、スマートじゃないのではないかと疑問に思っています。



簡潔なやり方などご存じの方いましたらご教授お願い致します。

投稿日時 - 2012-07-14 19:01:31

QNo.7590309

暇なときに回答ください

質問者が選んだベストアンサー

以下のようにUNION(読みはユニオンです。ウニオンではありません)でデータの取得を1回で済ませて表示の部分の記述を1箇所にする。という方法はあるかも知れません。

(SELECT '田中' AS 氏名, (SELECT COUNT(*) FROM table WHERE name LIKE '%田中%' AND class LIKE '%1組%') AS 1組, (SELECT COUNT(*) FROM table WHERE name LIKE '%田中%' AND class LIKE '%2組%') AS 2組)
UNION ALL
(SELECT '鈴木' AS 氏名, (SELECT COUNT(*) FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%1組%') AS 1組, (SELECT COUNT(*) FROM table WHERE name LIKE '%鈴木%' AND class LIKE '%2組%') AS 2組)

投稿日時 - 2012-07-14 20:13:35

お礼

ありがとうございました!!

投稿日時 - 2012-09-22 18:17:41

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

こんな風にテンポラリテーブルを使ってやるといいです
ちなみに'%田中%'だと大田中とかひっかかりますがいいですか?

//準備
create table hoge (id int,name varchar(20),class varchar(20));
insert into hoge values(1,'田中A','1組'),(2,'田中B','1組'),(3,'田中C','2組'),(4,'大田中A','1組'),(5,'佐藤A','2組'),(6,'佐藤B','2組'),(7,'佐藤C','2組'),(8,'鈴木A','1組'),(9,'鈴木B','1組'),(10,'鈴木C','1組');

//ここから
create temporary table fuga(name varchar(20));
insert into fuga values('田中'),('佐藤'),('鈴木'),('高橋');
select fuga.name,sum(class like '%1組%') AS 1組,sum(class like '%2組%') AS 2組
from fuga left join hoge on hoge.name like concat('%',fuga.name,'%') group by name

投稿日時 - 2012-07-14 23:48:19

お礼

≫ちなみに'%田中%'だと大田中とかひっかかりますがいいですか?

お、おおぅ!!確かに!!
その辺も考慮して使います!!

回答ありがとうございました!!

投稿日時 - 2012-09-22 18:17:43

あなたにオススメの質問