アプリ版:「スタンプのみでお礼する」機能のリリースについて

会員ページでページビューを見たくて
下記のように作ろうとしていますが
表示をどのようにしたらいいか分かりません。
**カウントは取れています**

テーブル count
sn pagename access (フィールド)
1 001top 10
2 001a 13
3 001b 8
4 002t 23
5 002a 18
6 002b 20

このように入れて、表示は下記のようにしたいのです

ID: 001
合計アクセス
31
topページアクセス
10
aのページアクセス
13
bのページアクセス
8

似たような質問が多くてスミマセン、
頭が固くて応用が利きません。。。

アドバイス、お願いいたします。


ちなみに、カウントを取るのは下記のようにしています

カウントを取るページに以下を張る
<IMG src="pgview.php?pagename=001t" height="1" width="1">


pgview.php
<?php
require_once("dbini.php");

$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
$selectdb = mysql_select_db($DBNAME, $con);


$sql = "update count set access = access + 1 where pagename = '$pagename'";
mysql_query($sql, $con);

$con = mysql_close($con);
?>

MYSQL
ver4.0.26

PHP
ver4.2.2

A 回答 (6件)

uidが一つならもっと単純な書式です


ただしuidをどうやって特定するかが問題には
なりますが。
別に聞いてもらう分にはかまわないですけど、
これってあくまで応用ですのでちょっとでも
考えてから質問しないと上達しませんよぉ。

<?PHP
$con=mysql_connect($host,$user,$pass);
mysql_select_db($db,$con);

$sql = "SELECT SUM(`access`) AS `access` FROM `count` WHERE `uid`='1';";
$res=mysql_query($sql,$con);
while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei['sum']=$rows['access'];
}

$sql = "SELECT * FROM `count` WHERE `uid`='1' ORDER BY `uid`,`page`;";
$res=mysql_query($sql,$con);


while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['page']]=$rows['access'];
}
foreach ($shuukei as $key => $val){
print "{$key} access:$val<br>\n";
}
?>
    • good
    • 0
この回答へのお礼

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

本当は数日でも考えて、それでも分からない時に
ヒントをもらう。。
これがこのようなサイトのマナーだと思って入るのですが
自分の実力以上のものを求められ
大変あせっているので、皆さんにご迷惑をかけています。。

必ず、今教えていただいているような事は
自分の実力にしてもう一度感謝したいと思います。

何度もお付き合い頂きましてありがとうございました。

お礼日時:2006/03/27 23:44

やり方は2つ



(1)個別データと集計行を一度の問い合わせ
で処理できません。
2度問い合わせればよいでしょう。

<?PHP
$con=mysql_connect($host,$user,$pass);
mysql_select_db($db,$con);

$sql = "SELECT `uid`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;";
$res=mysql_query($sql,$con);
while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']]['sum']=$rows['access'];
}

$sql = "SELECT * FROM `count` ORDER BY `uid`,`page`;";
$res=mysql_query($sql,$con);


while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']][$rows['page']]=$rows['access'];
}
foreach ($shuukei as $key1 => $val1){
print "ID:$key1<br>\n";
foreach ($val1 as $key2 => $val2){
print "{$key2} access:$val2<br>\n";
}
}
?>

(2)PHPで配列の合計を得る方法があります。
個別データが数十~数百しかないのであれば、
PHPに任してしまう手もあります。

<?php
$con=mysql_connect($host,$user,$pass);
mysql_select_db($db,$con);

$sql = "SELECT * FROM `count` ORDER BY `uid`,`page`;";
$res=mysql_query($sql,$con);

while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']][$rows['page']]=$rows['access'];
}
foreach ($shuukei as $key1 => $val1){
print "ID:$key1<br>\n";
print "sum access:".array_sum($val1)."<br>";
foreach ($val1 as $key2 => $val2){
print "{$key2} access:$val2<br>\n";
}
}
?>

この回答への補足

yambejp 様 いつもありがとうございます!!

(1)の方法で使わせていただきます。

もうひとつだけお願いします、
これを UID 一人分だけ表示するにはどうしたらいいでしょうか?
これ以上聞くのも。。。なんですが

よろしくお願いいたします。

補足日時:2006/03/27 21:50
    • good
    • 0

私の環境とは異なるのでエラーがどこででるかは


わかりませんが、基本的に新しいDBの形式であれば
sqlの発行も一つだけで済みそうですし、特に
問題もないかと。

SELECT * FROM `count` ORDER BY `uid`,`page`;

お手数ですみませんが、エラーの状況などまた
ご報告いただけるとフォローできるかもしれません。

<?PHP
//$host,$user,$pass,$dbは予め指定。

$con=mysql_connect($host,$user,$pass);
mysql_select_db($db,$con);

$sql = "SELECT * FROM `count` ORDER BY `uid`,`page`;";
$res=mysql_query($sql,$con);


while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']][$rows['page']]=$rows['access'];
}
foreach ($shuukei as $key1 => $val1){
print "ID:$key1<br>\n";
foreach ($val1 as $key2 => $val2){
print "{$key2} access:$val2<br>\n";
}
}
?>

この回答への補足

うまくいきました。!!
私がテーブル名を間違えていました(スペルミスです)。。

スミマセン、もう少し教えてください。
uid(一人分) の合計をa b c d の上に表示させるのはどうしたらいいですか?

それから、実際に表示させるのは uid 1人分なのですが
これもどう記入したらいいでしょうか?

補足日時:2006/03/27 18:35
    • good
    • 0

すみません。

私の記述ミスです
whileの中のrowsの一つがrowになっていました。

正:
while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']][$rows['page']]=$rows['access'];
}

この回答への補足

スミマセン、やはりエラーが出ます。

そこでせっかくご指導いただいている時に勝手なんですが、
前々回示していただいた方が、正しいような気がして
こちらなら表示させられると思ったのですが、
やはり、勉強不足で表示しません。(今回もカウントはしています)

甘えているのは分かっているのですが、、、
どうか宜しくお願いいたします。

count(テーブル名)
uid(int)  page(varchar10) access(int)
1      a        10
1      b        5
1      c        1
2      a        11
2      b        6
2      c        2
表示を同じく
ID:1の方のアクセス
全体
16
a のpage
10
b のpage
5
c のpage
1
ID:2の方のアクセス
全体
19
a のpage
11
b のpage
6
c のpage
2

補足日時:2006/03/25 01:14
    • good
    • 0

失礼しました。

では順番に

SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;
とすると、ユーザーIDごとの集計がでます。
uid page access
001 ALLDATA 31
002 ALLDATA 61

SUBSTRINGはpagenameの頭から3文字もってきてます。
集計用の名前としてALLDATAとしました。
これをテンポラリテーブルに流し込んでるのが最初
の行です。

2行目のINSERT INTOで、全てのデータをSHUUKEI
テーブルに流し込んでます。

3行目で検索結果を表示します。
SQL上ではこんな感じ。
uid page access
001 ALLDATA 32
001 top 10
001 a 14
001 b 8
002 ALLDATA 61
002 t 23
002 a 18
002 b 20

これをPHPでかくと。

<?php
$link=mysql_connect($host,$user,$pass);
mysql_select_db($db,$link);

$sql = "CREATE TEMPORARY TABLE `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;";
$res=mysql_query($sql,$link);
$sql = "INSERT INTO `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,SUBSTRING(`pagename`,4,3) AS `page`,`access` FROM `count`;";
$res=mysql_query($sql,$link);
$sql = "SELECT * FROM `SHUUKEI` ORDER BY `uid`;";
$res=mysql_query($sql,$link);

while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']][$row['page']]=$rows['access'];
}
foreach ($shuukei as $key1 => $val1){
print "ID:$val1<br>\n";
foreach ($key1 as $key2 => $val2){
print "{$key2} access:$val2<br>\n";
}
}

?>

ちなみにpagenameをわけるというのは
どうせ、ユーザーIDとページを分けて集計
するのであれあば最初からuidとpageという
構成にすればよいということです。

この回答への補足

丁寧な解説ありがとうございます。
uid と page 分けた方が考えやすいですよね、
思いつきませんでした。。

今、教えて頂いた式を自分の環境に書き換えてUPしました。
<?php
//データベース関連のデータをインクルードします
require_once("dbini.php");

//MySQLに接続します
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
//データベースを選択します
$selectdb = mysql_select_db($DBNAME, $con);

$sql = "CREATE TEMPORARY TABLE `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;";
$res=mysql_query($sql,$con);
$sql = "INSERT INTO `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,SUBSTRING(`pagename`,4,3) AS `page`,`access` FROM `count`;";
$res=mysql_query($sql,$con);
$sql = "SELECT * FROM `SHUUKEI` ORDER BY `uid`;";
$res=mysql_query($sql,$con);

while($rows = mysql_fetch_array($res,MYSQL_ASSOC)){
$shuukei[$rows['uid']][$row['page']]=$rows['access'];
}
foreach ( $shuukei as $key1 => $val1){
print "ID:$val1<br>\n";
foreach ($key1 as $key2 => $val2){
print "{$key2} access:$val2<br>\n";
}
}
?>
すると以下のような文が返ってきました。

ID:Array

Warning: Invalid argument supplied for foreach() in /virtual/wave/public_html/mng/pagecount.php on line 22

ちなみに22行目は
foreach ($key1 as $key2 => $val2){
の所です。

ご親切な解説に甘えていますが、
宜しくお願いいたします。

補足日時:2006/03/24 18:06
    • good
    • 0

集計単位をみると個人的にはpagenameは分けた方が


いいと思いますよ。

いまのままだとこんな感じでいけそうです。
CREATE TEMPORARY TABLE `SHUUKEI`
SELECT SUBSTRING(`pagename`,1,3) AS `uid`,'ALLDATA' AS `page`,SUM(`access`) AS `access` FROM `count` GROUP BY `uid`;
INSERT INTO `SHUUKEI` SELECT SUBSTRING(`pagename`,1,3) AS `uid`,SUBSTRING(`pagename`,4,3) AS `page`,`access` FROM `count`;
SELECT * FROM `SHUUKEI` ORDER BY `uid`;

もちろん集計だけは別のSQLで処理しても構いません。

この回答への補足

いつもありがとうございます!

一生懸命読んでいますが。。意味が分かりません。
恐れ入りますが、少しだけでも解説をお願いできませんか?

それから、pagenameを分けた方がいいというのは
具体的に、どのようにしたらいいのでしょう?

何度もスミマセンが、宜しくお願いいたします。

補足日時:2006/03/24 15:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!