Richtiger Recount der Postzahlen der User?

Started by robo47, June 14, 2004, 05:16:21 PM

Previous topic - Next topic

robo47

ich suche eigentlich eher zum basteln das query das man benötigt um in nem script einmal die posts anzuzeigen die ein user hat, einmal die die nicht gezählt werden und dann noch die die gezählt werden.

weil ich habe seit einiger zeit bei einigen boards eingestellt dass die posts nciht gezählt werden und jetzt wollte ich dass die werte neu eingelesen werden, sprich die neuen werte danach in der datenbank stehen, die lösung war im ansatz recht einfach

die id's aller boards abholen die nicht gezählt werden, die der die gezählt werden
daraus kann ich dann für jedes topic ableiten ob die posts darin gezählt werden und dann so weiter das ganze auflösen bis ich ein langes query hab für jeden user, was jeden post überprüft ob er in einem der topics ist, das muss man halt für diejenigen die gezählt werden und für die die nicht gezählt werden machen, bei 2.000 posts und 30 mitgliedern hielt isch das ncoh in grenezn, auf wenn meine querystruktur schon massig zeit brauchte. jetzt wollte ich das ganze für 50.000 user und ca 100 user machen, da geriet das script allerdings schon sehr stark an seine grenzen.

leider kann ich die sources hier momentan nicht posten, weil die auf nem rechner liegen wo ich momentan ned rankomme, jetzt wollte ich wissen wie man das am einfachsten mit subquerys, joins und so am besten macht und vor allem so, das nicht so viel daten immer von mysql zu php, dann dort wieder zu nem query zusammengesetzt werden, sondern am besten in nur einem query das ganze.

jemand ne idee oder ein script der das macht, das ich mir mal anschauen kann?

wäre echt praktich, weil es mcih stört, dass die user jetzt teilweise 600-700 posts haben nur aus den alten spam-boards, wo ich noch nciht eignestellt hatte dass die posts nciht zählen.


mfg
robo47

andrea

Admin-Menü: Forum Totalwerte neu berechnen.

Andrea Hubacher
Ex Lead Support Specialist
www.simplemachines.org

Personal Signature:
Most recent work:
10 Aqua Themes for SMF



robo47

Quote from: andrea on June 14, 2004, 05:50:06 PM
Admin-Menü: Forum Totalwerte neu berechnen.

das berechnet diese werte aber nicht neu oder? hab das schon öfters gemacht, aber posts blieben unberührt, die funktion ist soweit ich weis nur dafür da, die einzelnen topic und postswerte für die einzelnen boards neu zu erstellen und ein paar statisitken.

die anzahl der posts der einzelnen userwird darüber nicht neu berechnet, wenn ich mcih nicht irre hab ich uach irgendwo mal ein topic gesehen wo das gesagt wird, unter anderem weil es als gewollt angesehen wurde, dass auch z.b. gelöschte posts eines users weiterhin zählen auch wenn sie gelöscht sind, oder jemadn ein board so laufen hat, dass er alte topics immer löscht, trotzdem die anzahl der posts weiterhin die selbe bleiben soll.

ich lasse mcih gerne eines besseren beleheren.

mfg
robo47

Christian Land

Es gibt keine einfache Query die das leistet (zumindest nicht, dass ich wüsste)... die Infos ob Posts gezählt werden liegen in yabbse_boards, die Infos wo eine Nachricht hingehört ist verteilt auf yabbse_topics und yabbse_messages... von daher dürfte die Query extrem komplex werden, wenn sie mit MySQL überhaupt machbar ist... MySQL unterstützt Sub-Selects nämlich erst in den neueren Versionen....

Allerdings kann man das mit ein bisschen PHP ganz gut lösen...

<?php

include_once(
'Settings.php');

// connect to db

$dbcon mysql_connect($db_server$db_user$db_passwd) or die(mysql_error());
mysql_select_db($db_name) or die(mysql_error());

// user-id

$user 1;

//

$boards = array();
$ncp 0;
$cp 0;

// Ok...

$sqlquery 'SELECT id_board FROM '.$db_prefix.'boards WHERE count = 1'; // not counted
$request mysql_query($sqlquery) or die(mysql_error());

while ($row mysql_fetch_assoc($request))
$boards[] $row['id_board'];

if (count($boards)>0)
{
$sqlquery 'SELECT * FROM '.$db_prefix.'topics AS t LEFT JOIN '.$db_prefix.'messages AS m ON (m.ID_TOPIC = t.ID_TOPIC) WHERE (t.ID_BOARD IN ('.implode(',',$boards).')) AND (m.id_member = '.$user.')';
$request mysql_query($sqlquery) or die(mysql_error());
$ncp mysql_num_rows($request);
}

// ---

$sqlquery 'SELECT id_board FROM '.$db_prefix.'boards WHERE count = 0'; // counted
$request mysql_query($sqlquery) or die(mysql_error());

while ($row mysql_fetch_assoc($request))
$boards[] $row['id_board'];

if (count($boards)>0)
{
$sqlquery 'SELECT * FROM '.$db_prefix.'topics AS t LEFT JOIN '.$db_prefix.'messages AS m ON (m.ID_TOPIC = t.ID_TOPIC) WHERE (t.ID_BOARD IN ('.implode(',',$boards).')) AND (m.id_member = '.$user.')';
$request mysql_query($sqlquery) or die(mysql_error());
$cp mysql_num_rows($request);
}

echo '<pre>';
echo 'Posts in nicht gezählten Brettern : '.$ncp."\n";
echo 'Posts in gezählten Brettern       : '.$cp."\n";
echo '</pre>';

?>


...ins Verzeichnis kopieren und $user auf die User-ID setzen, für die gezählt werden soll....

robo47

****** stimmt ja, hmm aber wenn ich ne neue version von mysql drauf habe wäre es theorhetisch möglich?

naja egal, cih schau wenn wenn ich von der schule zuahuse bin mal deinen quelltext an.

weil dann schreib ich mir das um und mach das so, dass ich einfach die asugabe in eine umschreiben für die posts des users mache.

vielen dank mal.

Christian Land

Ich korrigiere mich *g*

Es geht doch.... allerdings ist die Query relativ langsam...

SELECT IF(b.count=0,'gezählt','nicht gezählt') AS modus, COUNT(*) AS posts FROM
yabbse_boards AS b
LEFT JOIN
yabbse_topics AS t ON (b.id_board = t.id_board)
LEFT JOIN
yabbse_messages AS m ON (m.ID_TOPIC = t.ID_TOPIC)
WHERE
(m.id_member = 1)
GROUP BY
(b.count);


gibt z.B. die Werte für User 1 aus...

Aber generell ändert es halt nix daran, dass die Werte falsch sind weil gelöschte Posts nicht mehr gezählt werden....

robo47

Quote from: SnowCrash on June 15, 2004, 08:56:37 AM
Ich korrigiere mich *g*

Es geht doch.... allerdings ist die Query relativ langsam...

SELECT IF(b.count=0,'gezählt','nicht gezählt') AS modus, COUNT(*) AS posts FROM
yabbse_boards AS b
LEFT JOIN
yabbse_topics AS t ON (b.id_board = t.id_board)
LEFT JOIN
yabbse_messages AS m ON (m.ID_TOPIC = t.ID_TOPIC)
WHERE
(m.id_member = 1)
GROUP BY
(b.count);


gibt z.B. die Werte für User 1 aus...

Aber generell ändert es halt nix daran, dass die Werte falsch sind weil gelöschte Posts nicht mehr gezählt werden....

hmm thx, aber dass die posts die gelöscht wurden nciht gezählt werden das will ich eigentlich so, weil bei mir nur posts gelöscht werden die absoluter schwachsinn sind oder unnötig. mich stört es nämlich dass gelöschte posts ansosnten zählen.

so dann werde ich mal schauen wie schnell das query funktiert wenn ich es direkt über phpmyadmin laufen lasse.

vielen dank schonmal.

robo47

hmm also das query ist super, ca 20 % schneller als meine einzelnen querys.

insgesamt bei nem board mit 35.000 posts und 57 usern dauert das ganze 25 sekunden, wovon 23 sekunden auf die querys fallen.

wer das script will, hier:
je nachdem was man machen will sind gewisse bereiche auskommentiert, d.h. man kann sie in der grundeinstellung nur die dinge ausgeben lassen (den eigentlichen stand) oder mann kann wenn man die kommentarzeichen entfernt auch gleich die posts in die datenbank übertragen :P



<?
mysql_connect('localhost','','');
mysql_select_db('');
$prefix 'smf_';

$sql1 MYSQL_QUERY("SELECT ID_MEMBER,realName FROM board_members") or die(mysql_error());

ECHO 
'
     <table border="1">
     <tr> 
          <td>Name</td> 
          <td>gezählt</td> 
          <td>nicht gezählt</td> 
          <td>gesamt</td> 
     </tr> 
     <tr> 
          <td>&nbsp;</td> 
          <td>&nbsp;</td> 
          <td>&nbsp;</td> 
          <td>&nbsp;</td> 
     </tr> 
	
'
;

WHILE(
$data1 MYSQL_FETCH_ASSOC($sql1))
{

$query1 "
	
	
SELECT IF(b.countPosts=0,'gezählt','nicht gezählt') AS modus, COUNT(*) AS posts 
	
	
FROM 
{$prefix}boards AS b 
	
	
LEFT JOIN 
{$prefix}topics AS t ON (b.id_board = t.id_board)
	
	
LEFT JOIN  
{$prefix}messages AS m ON (m.ID_TOPIC = t.ID_TOPIC)  
	
	
WHERE (m.id_member = 
{$data1['ID_MEMBER']} ) 
	
	
GROUP BY (b.countPosts)
	
	
"
;
$sql2 MYSQL_QUERY($query1) or die(mysql_error());

$data2 MYSQL_FETCH_ASSOC($sql2);
$data3 MYSQL_FETCH_ASSOC($sql2);
(
strlen($data2['posts']) == 0) ? $data2['posts'] = null ;
(
strlen($data3['posts']) == 0) ? $data3['posts'] = null ;
$sum $data2['posts'] + $data3['posts'];

ECHO 

     <tr> 
          <td>'
.$data1['realName'].'</td> 
          <td>'
.$data2['posts'].'</td> 
          <td>'
.$data3['posts'].'</td> 
          <td>'
.$sum.'</td> 
     </tr> 
     '
;

#$sql3 = MYSQL_QUERY("UPDATE {$prefix}members SET posts='".$data2['posts']."' WHERE  ID_MEMBER = '".$data1['ID_MEMBER']."'") or die(mysql_error()); 
/* möglichkeit gleich alles weiterzugeben */
#ECHO "UPDATE board_members SET posts='".$data2['posts']."' WHERE  ID_MEMBER = '".$data1['ID_MEMBER']."'"."; <br>";  
/* möglichkeit die nötigen querys auszugeben */
}

ECHO 
'</table>';
ECHO 
'<br><br>Fertig';
?>

carhartt

klasse, hat mir prima geholfen dein script!  :)
straight is great! ;)

Advertisement: