Seite 1 von 1

kniffliger MySQL Code

Verfasst: 09.06.2003 09:51
von Siegem Metatron
Grüß Euch,

Einleitend: Ich hab einen Beitragszähler gebastelt der zusätzlich alle Beiträge eines bestimmten Forenteils zählt. Klappt wunderbar.

Um jetzt aktuelle Zahlen der bisherigen Seperaten Beiträge zu erhalten muss die neue Zähler Spalte damit erst mal befüllt werden.

welcher Benutzer hat wieviel Beiträge in ein bestimmtes Forum geschrieben:

Code: Alles auswählen

SELECT poster_id, count(*)
FROM phpbb_posts
WHERE forum_id = 3
GROUP BY poster_id
jetzt müssten diese Werte der Spalte Count(*)
nur noch in die phpbb_users Tabelle der Spalte rp_users_posts geschrieben werden.

Ich suche also eine Into oder einen Update Befehl der mit alle Ergebnisse dort hineinschreibt.

Vielleicht hat einer von euch eine Idee wie ich diese Ergebnisse einfach in eine neue Spalte schreiben kann ?

Grüße ;)

Verfasst: 09.06.2003 10:29
von Pyramide
Theoretisch würde das so funktionieren:

Code: Alles auswählen

UPDATE phpbb_users u
SET rp_users_posts = (SELECT count(*) FROM phpbb_posts p WHERE p.forum_id = 8 AND p.poster_id = u.user_id)
Aber da mysql keine subqueries unterstützt, bleibt dir leider nichts anderes übrig, als deine o.a. Abfrage aus z.B. einem PHP-Script auszuführen und dann für jeden Datensatz eine UPDATE-Abfrage zu generieren.

Verfasst: 09.06.2003 11:08
von Siegem Metatron
sowas ähnliches war auch mein erster Gedanke, als Fehler meckerte er an das die Ergebnis Spalte count(*) nicht verwertbar ist.

Ich hab jedoch von Temporären Tabellen gelesen. in der man Daten zwischenspeichern könnte. Denk mal dies würde auf das selbe rauslaufen.
sowas vielleicht in der Art :

Code: Alles auswählen

CREATE TEMPORARY TABLE tmp (bla, bla, bla);
INSERT INTO tmp SELECT poster_id, count(*) 
FROM phpbb_posts 
WHERE forum_id = 3 
GROUP BY poster_id
zumindestens hätt ich die Daten nun extrahiert. Problem besteht nach wie vor *g* wie bekomm ich die nun aus der Temp in meine rp_user_posts

Und wenn man in MySQL @Variablen benutzt ?

Code: Alles auswählen

select @rp_posts:=rp_user_posts
FROM phpbb_posts 
WHERE forum_id = 3 
GROUP BY poster_id;
UPDATE phpbb_users u 
SET rp_users_posts = @rp_posts
WHERE forum_id = poster_id
war jetzt nur Theoretisch :)
(und wenn ich ganz ehrlich bin, auch noch keinen Plan hätte dies auf diese art und weise umzusetzen)

Vielleicht verrenn ich mich ja auch nur. Und es bleibt nix anderes übrig als diese über php auszulesen. Und anschliessend wieder in die MySQL einzulesen.

Was meinst du ? ;)

Verfasst: 09.06.2003 11:23
von Acid

Verfasst: 09.06.2003 11:34
von Siegem Metatron
Habs ähnlich gemacht:
funktion_posts.php

Code: Alles auswählen

$sign = ( $mode == 'delete' ) ? '- 1' : '+ 1';
ersetzt durch:

Code: Alles auswählen

	if ( $mode == 'delete' )
	{
		if ( $forum_id == '5' )
		{ $sign_rp = '- 1';
		}
		else
		{ $sign = '- 1';
		}
	}
	else
	{ $sign = '+ 1';
		If ( $forum_id == '5' )
		{ $sign_rp = '+1';
		}
	}

weitere änderung

Code: Alles auswählen

SET user_posts = user_posts $sign
ersetzt durch:

Code: Alles auswählen

SET user_posts = user_posts $sign , user_rp_posts = user_rp_posts $sign_rp
in der lang_mein.php

Code: Alles auswählen

$lang['RpPosts'] = "davon RP";
viewtopic.php:

Code: Alles auswählen

$poster_posts = ( $postrow[$i]['user_id'] != ANONYMOUS ) ? $lang['Posts'] . ': ' . $postrow[$i]['user_posts'] : '';
darunter:

Code: Alles auswählen

$rp_poster_posts = ( $postrow[$i]['user_id'] != ANONYMOUS ) ? $lang['RpPosts'] . ': ' . $postrow[$i]['user_rp_posts'] : '';

Code: Alles auswählen

'POSTER_POSTS' => $poster_posts,
darunter:

Code: Alles auswählen

'RP_POSTS' => $rp_poster_posts,
und zu guter letzt:

Code: Alles auswählen

$sql = "SELECT u.username, u.user_id, u.user_posts, u.user_from, u.user_website, u.user_email, u.user_icq, u.user_aim, u.user_yim, u.user_regdate, u.user_msnm, u.user_viewemail, u.user_rank, u.user_sig, u.user_sig_bbcode_uid, u.user_avatar, u.user_avatar_type, u.user_allowavatar, u.user_allowsmile, p.*,  pt.post_text, pt.post_subject, pt.bbcode_ui
ersetzen durch:

Code: Alles auswählen

$sql = "SELECT u.username, u.user_id, u.user_posts, u.user_rp_posts, u.user_from, u.user_website, u.user_email, u.user_icq, u.user_aim, u.user_yim, u.user_regdate, u.user_msnm, u.user_viewemail, u.user_rank, u.user_sig, u.user_sig_bbcode_uid, u.user_avatar, u.user_avatar_type, u.user_allowavatar, u.user_allowsmile, p.*,  pt.post_text, pt.post_subject, pt.bbcode_ui
viewtopic_body.tpl
von Template von Template verschieden. im zero:

Code: Alles auswählen

{postrow.POSTER_POSTS}<br />
darunter:

Code: Alles auswählen

{postrow.RP_POSTS}<br />
nur noch einfügen, und dann wars´s Perfekt. => Funktioniert.

Bleibende Frage, des aktuellen stands.
Also bisher haben viele bereits in dieses Forenteil geschrieben. Und der zähler soll nun wissen wieviele Beiträge denn bereits existieren.
Er addiert oder subtrahiert ja lediglich von der vorhandenen Zahl in meiner extraspalte rp_user_posts ( in der phpbb_users)

Verfasst: 09.06.2003 11:57
von Acid
Siegem Metatron hat geschrieben: Also bisher haben viele bereits in dieses Forenteil geschrieben. Und der zähler soll nun wissen wieviele Beiträge denn bereits existieren.
Er addiert oder subtrahiert ja lediglich von der vorhandenen Zahl in meiner extraspalte rp_user_posts ( in der phpbb_users)
Was soll passieren, wenn der Zähler weiss wieviel Beiträge geschrieben wurden (für jeden User oder generell in diesem Forum) ?

Verfasst: 09.06.2003 14:06
von Siegem Metatron
Jupp für jeden User einzeln.

im Topic siehts bei mir unter jedem Zähler so aus:
[ externes Bild ]

Doch der Zähler hat ja erst begonnen zu Zählen nach dem ich ihn einbaute. Logisch *g*

in diesem Forenteil. Bsp Spamforum. haben jedoch früher ebenso einige etwas reingeschrieben. Jetzt zählt der natürlich nicht von beginn der Geburt dieses Forenteils an. Mit dem Script von deinem Link ebenso wenig. Immer nur ab dem Zeitpunkt von dem es eingebaut wurde.

Um jetzt festzustellen wieviele Beiträge jeder User in ein bestimmtes Forenteil geschrieben hat, kann man dies machen:
(das bestimmte Forenteil hat bei mir die Nr.3)

Code: Alles auswählen

SELECT poster_id, count(*)
FROM phpbb_posts
WHERE forum_id = 3
GROUP BY poster_id
Hier stehen bereits alle aktuellen Daten parat.
Diese Daten müssten nur noch eingefügt werden in die phpbb_users
Spalte rp_user_posts
Quasi ein Into oder Update durchfüphren. *g* dies ist alles. Denn dann zählt der auch von der aktuellen Beitragszahl aller Beiträge von begin an.
Derzeitig ja nur von 0 beginnend zum zeitpunkt des einbaues.

Grüße ;)
Hm...eine Idee ?

Verfasst: 09.06.2003 18:10
von Pyramide

Code: Alles auswählen

<?php
$r = mysql_query("SELECT poster_id, count(*) AS anzahl FROM phpbb_posts WHERE forum_id = 3 GROUP BY poster_id");
while($row=mysql_fetch_array($r)) {
  mysql_query("UPDATE phpbb_users SET rp_users_posts=$row[anzahl] WHERE user_id=$row[poster_id]");
}
?>
Das schreiben dieses kleinen Scripts hat mit <2 Minuten nicht so lange gedauert, wie die ganzen Beiträge in diesem Thema zu verfassen. :roll:

Verfasst: 09.06.2003 23:08
von Siegem Metatron
Uff. wenn alles nix geholfen hätt, so währ ich am ende auch über so eine lösung gegangen. Auch wenn ich es mit sicherheit extrem kompliziert gemacht hätte. Hatt schon angefangen. Und fast eine A4 Seite php geschrieben.

Pyramide, du bist wiedermal Genial.
ich danke dir :)
Funktioniert klasse.

dir auch Acid, schliesslich haste dir auch den Kopf darüber zerbrochen.

Hey ;) was haltet ihr davon wenn ihr daraus ein Mod strickt ?
Ich denk mir alle RP(G) Foren Besitzer würde dieses Thema brennend interessieren. Immerhin kommt es auf ein bestimmtes Forenteil ganz besonder san.
Der aus dem Link weiter oben, und meine Version haben beide zum nachteil das dieser nicht rückwirkend beginnt zu Zählen.
Mit Pyramide´s Code anmerkung funktioniert das ganze wenigstens.

Grüße ;)
Siegem Metatatron
bis dann mal