人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLの集約関数について質問です!

テーブル1
C1 F2
1 1
2 1
3 2
1 2
2 3

下記のSQL文で実行しています。
※変数Hに1を代入する
$H = 1;

$sql = "";
$sql .= "select F2, count(*) as cnt from テーブル1";
$sql .= " WHERE C1 = '{$H}'";
$sql .= " group by F2";
$rsc = mysql_query($sql);

結果は、
1 = 1コ
2 = 1コ
になります。
このテーブルにフィールドを二つ追加して、

テーブル1
C1 F2 C3 F4
1 1 2 4
2 1 1 3
3 2 1 1
1 2 3 1
2 3 4 2

今度は変数Hが1だった場合にC1とC3を参照してとぢらかが一致したもののFのカテゴリの数を集約したいのですが、上手く説明できません。
頭の中では下記のような感じです。

C1 F2
1 1
2 1
3 2
1 2
2 3

C3 F4
2 4
1 3
1 1
3 1
4 2

結果
1 = 2コ
2 = 1コ
3 = 1コ

上記の結果を出したいのですが、この説明でお分かりの方は、教えて下さい!

●質問者: black_kenchan
●カテゴリ:ウェブ制作
✍キーワード:as CNT GROUP MySQL RSC
○ 状態 :終了
└ 回答数 : 14/14件

▽最新の回答へ

1 ● b-wind
●14ポイント

問題は分かるのですが、テーブル設計に問題があるような気が。

MySQL5 ならサブクエリが使えるのでやりやすいかもしれません。

SELECT F,sum(cnt) FROM
(
 SELECT F2 AS F,count(*) AS cnt FROM テーブル1
 WHERE C1 = '$H'
 UNION
 SELECT F4 AS F,count(*) AS cnt FROM テーブル1
 WHERE C3 = '$H'
) AS table_all
 GROUP BY F;

試していないので間違っているかもしれませんが。

◎質問者からの返答

説明不足ですいません。文字数がオーバーしてしまいあまりかけませんでした。

商品の管理なのですが、CがメインカテゴリでFがサブカテゴリです。

一つの商品に二つの属性を持たせたくてこのような感じになっています。

上記のSQL文なのですが、MySQL4でも可能でしょか?


2 ● b-wind
●14ポイント

前の回答は、MySQL4.1 以上で可能、MySQL4.0以下だと不可能のはず。


CREATE TEMPORARY TABLE テーブル_tmp
 ( F text, cnt int )
 SELECT F2 AS F,count(*) AS cnt FROM テーブル1
 WHERE C1 = '$H'
 UNION
 SELECT F4 AS F,count(*) AS cnt FROM テーブル1
 WHERE C3 = '$H';
SELECT F,sum(cnt) FROM テーブル_tmp GROUP BY F;

ならどのバージョンでもいけると思います。

◎質問者からの返答

両方試したのですが、出来ないッス!

なんででしょうか?


3 ● b-wind
●14ポイント

なんででしょうね。

エラーメッセージは出ていると思うので、提示していただけますか?

◎質問者からの返答

あれから、色々試してるのですがだんだん近づいてきて下記のSQL文だとかなり近いところまで行きました。

※WHEREは省略しています。

SELECT F2 AS F, count(*) as cnt FROM テーブル1 group by F UNION ALL SELECT F4 AS F, count(*) as cnt FROM テーブル1 group by F

現在は、

1 = 2コ

2 = 1コ

3 = 1コ

1 = 2コ

2 = 1コ

3 = 1コ

見たいな感じでC1とC3の結果が繰り返されているのでまとめるだけなのですが・・・・


4 ● b-wind
●14ポイント

その状態からさらにまとめるには、サブクエリとして扱い再度 GROUP 化するしか無いと思います。

ただし、それは MySQL4.1 からの機能なので、それ以前のバージョンではテンポラリテーブルを使う事で代用します。

http://dev.mysql.com/doc/refman/4.1/ja/create-table.html

◎質問者からの返答

難しくて分からなかったです・・・

回答1の答えなのですが、試しに

SELECT F2 AS F,count(*) AS cnt FROM テーブル1

のみでやったのですがこれだけもエラーでした・・COUNTの使い方がいけないかも知れません。

逆にそこだけ直せば出来るかも・・・

何か良い方法は無いでしょうか?


5 ● b-wind
●14ポイント

集約関数は GROUP BY が無いと使えません。

SELECT F2 AS F,count(*) AS cnt FROM テーブル1 GROUP BY F2;

でないと無理。

という事で1でのの解答は間違っていますね。惑わせて閉まったようですいません。

SELECT F,sum(cnt) FROM
(
 SELECT F2 AS F,count(*) AS cnt FROM テーブル1
 WHERE C1 = '$H'
 GROUP BY F2
 UNION
 SELECT F4 AS F,count(*) AS cnt FROM テーブル1
 WHERE C3 = '$H'
 GROUP BY F4
) AS table_all
 GROUP BY F;

がおそらく正しい。


結局 MySQL のバージョンはなんなんでしょうか?

SELECT VERSION();

で調べられます。

http://dev.mysql.com/doc/refman/4.1/ja/miscellaneous-functions.h...

◎質問者からの返答

バージョンは、4.0.0みたいです。

試したのですが、やっぱり出来ません。

エラーメッセージは

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource

こんな感じでした。

なんで、できないのですかね・・・


1-5件表示/14件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ