[gelöst] brauche hilfe für eine saubere php Lösung und Cronjob

VIPbanner_de

www.VIPbanner.de
ID: 72674
L
1 Mai 2006
2.598
150
hallo miteinander. ich hab mal wieder ein kleines Problem bei dem ich eure fachkundige Hilfe benötige :)

Was soll die php Datei machen:
Diese Datei soll später automatisch mittels Cronjob alle paar Stunden aufgerufen werden und sollte ohne abruch arbeiten. Als erstes bei allen in "datas" befindlichen Userids "opt" auf "1" umgestellt. Dann sollen aus ("datas") alle Userid´s gefiltert werden bei denen "free" gleich ja ist. Hier kann es sein das ein User mehrmals in "datas" vorhanden sein kann, wobei der User nur einmal gewertet werden darf. jeder User der da mindestens 1x drin ist mit "free=ja" soll in "userdatas" bei folgende Änderung haben "dynamischerwert=10"





PHP:
echo"Folgende User wurden geändert";
$info = mysql_query("SELECT userid, free FROM `datas` WHERE `free` = 'ja' ORDER BY userid ASC");
$ask = "UPDATE `userdatas` SET `dynamischerwert` ='5'";
while ($ur = mysql_fetch_row($info)) {
$userid = $ur[0];
$free = $ur[1];

$ask2 = "UPDATE `userdatas` SET `dynamischerwert` ='10' WHERE id='$userid'";
$result = mysql_query($ask2) or die(mysql_error());
echo"UserID $userid - Status ($free) - dynamischer Wert ist jetzt nicht mehr 5 sondern 10<br>";

Ich bekomme es nicht hin das jeder User nur einmal abgefragt wird und dass der Cronjob zuende geführt wird. Es werden immer nur 20 User geändert dann bricht der ab. Wenn ich die Datei dann manuell aufrufe werden alle geändert.
 
Zuletzt bearbeitet:
Irgendwie machst du es unnötig kompliziert, bzw. macht dein Code nicht genau das, was du beschreibst:

Als erstes bei allen in "datas" befindlichen Userids "opt" auf "1" umgestellt

PHP:
mysql_query('UPDATE datas SET opt=1');

Dann sollen aus ("datas") alle Userid´s gefiltert werden bei denen "free" gleich ja ist
jeder User der da mindestens 1x drin ist mit "free=ja" soll in "userdatas" bei folgende Änderung haben "dynamischerwert=10"

PHP:
$select_user = mysql_query('SELECT userid FROM datas WHERE free="ja"');
while(list($userid)=mysql_fetch_row($select_user)){
mysql_query('UPDATE userdatas SET dynamischerwert=10 WHERE id='.$userid.'');
}
 
hi, danke für deine Antwort.

Nur spart mir das nicht die überflüssigen datenbankabfragen:

UserID 19 - jetzt dynamisch auf 10
UserID 19 - jetzt dynamisch auf 10
UserID 27 - jetzt dynamisch auf 10
UserID 60 - jetzt dynamisch auf 10
UserID 89 - jetzt dynamisch auf 10
UserID 93 - jetzt dynamisch auf 10
UserID 93 - jetzt dynamisch auf 10
UserID 104 - jetzt dynamisch auf 10
UserID 110 - jetzt dynamisch auf 10
UserID 110 - jetzt dynamisch auf 10
UserID 110 - jetzt dynamisch auf 10
...etc

Es soll ja jeder User nur 1x bearbeitet werden, auch wenn er mehrfach vorhanden ist
 
Wenn ein User in `datas` mehrmals drin sein kann, du den User aber nur einmal selektieren möchtest kann folgendes helfen:

Du hast:
SELECT userid, free FROM `datas` WHERE `free` = 'ja' ORDER BY userid ASC
Mach mal daraus:
SELECT userid, free FROM `datas` WHERE `free` = 'ja' ORDER BY userid ASC GROUP BY userid

Dann werden am Ende alle Datensätze mit der gleichen UserID zusammengefasst. Sollte das sein, was du möchtest...
 
GROUP BY? Ne, dann lieber ein DISTINCT.


PHP:
$select_user = mysql_query('SELECT DISTINCT userid FROM datas WHERE free="ja"'); 
while(list($userid)=mysql_fetch_row($select_user)){ 
mysql_query('UPDATE userdatas SET dynamischerwert=10 WHERE id='.$userid.''); 
}
 
MySQL wird bei dem GroupBy- und- Distinct Query genau das Gleiche tun, von daher macht es keinen Unterschied.
(mit dem nur minimalen Unterschied, dass in deinem Query im ResultSet das free-Attribut nicht auftaucht, wofür auch)

free wird in dem Anfangscode ja benutzt und später auch ausgegeben.
Wenn man free mit ausliest, sollte doch GroupBy besser sein, oder? Wenn eine UserID zwei unterschiedliche free Werte hat, hilft DISTINCT doch eigentlich nicht ?
 
also ich habs mal mit group by getestet.. klappt wunderbar.. allerdings muss man erst die gruppierung machen dann die order by, sonst gehts net.. auch der cronjob funktioniert jetzt richtig.. also ist das Problem hiermit gelöst :) Danke allen beteiligten!
 
free wird in dem Anfangscode ja benutzt und später auch ausgegeben.
Wenn man free mit ausliest, sollte doch GroupBy besser sein, oder? Wenn eine UserID zwei unterschiedliche free Werte hat, hilft DISTINCT doch eigentlich nicht ?

Wenn ich im Query eine WHERE-Bedingung habe, die dafür sorgt, dass "free" immer "ja" ist, dann macht die Ausgabe dessen keinen Sinn.
Somit kann eine UserID auch keine zweit verschiedenen free-Werte haben. Das wird eben durch die WHERE-Bedingung ausgeschlossen.
 
free wird in dem Anfangscode ja benutzt und später auch ausgegeben.
Wenn man free mit ausliest, sollte doch GroupBy besser sein, oder? Wenn eine UserID zwei unterschiedliche free Werte hat, hilft DISTINCT doch eigentlich nicht ?

Beide Querys sehen in der Ausführung in etwa so aus:
Code:
1. CREATE TEMPORARY TABLE xyz (.....)
2. INSERT IGNORE INTO xyz SELECT userid FROM datas WHERE free="ja" #um doppelte Werte zu vermeiden ;)
3. SEND RESULT TO CLIENT
4. DELETE TABLE xyz

Wenn ich im Query eine WHERE-Bedingung habe, die dafür sorgt, dass "free" immer "ja" ist, dann macht die Ausgabe dessen keinen Sinn.
sehe ich auch so
 
allerdings muss man erst die gruppierung machen dann die order by, sonst gehts net..

Mist, da war ich mir nicht sicher ob erst ORDER BY und dann GROUP BY kommt ^^

Wenn ich im Query eine WHERE-Bedingung habe, die dafür sorgt, dass "free" immer "ja" ist, dann macht die Ausgabe dessen keinen Sinn.
Somit kann eine UserID auch keine zweit verschiedenen free-Werte haben. Das wird eben durch die WHERE-Bedingung ausgeschlossen.

Ups, ja ist klar ^^ Übersehen :sick:
 
MySQL wird bei dem GroupBy- und- Distinct Query genau das Gleiche tun, von daher macht es keinen Unterschied.
(mit dem nur minimalen Unterschied, dass in deinem Query im ResultSet das free-Attribut nicht auftaucht, wofür auch)

Das Ergebnis ist das gleiche. MySQL macht aber sicherlich nicht das gleiche. Ein DISTINCT ist schneller als ein GROUP BY. Ein EXPLAIN sagt dir auch warum.
 
Leets fight! *scnr* :shifty:
nö, nur ich bin auch net fehlerfrei, kanns nur nicht richtig reproduzieren bzw irgendwo finden.

Er kannst natürlich argumentieren, dass GROUP BY automatisch sortiert, aber mit ORDER BY NULL kann mans ja deaktivieren ^^
Ist dann aber trotzdem noch die gleiche Vorgehensweise, bei GROUP BY hängt nur noch der Sortierprozess dran
 
Dann hast du auch Beispiele oder Docs dazu?
Ich finde nämlich nur gegenteiliges.

Hast du dir das Resultat von EXPLAIN schon angesehen? Ein using filesort ist das, was man nicht will, denn es kostet immer Performance.

Ein GROUP BY kann von der Performance nur dann mithalten, wenn ein Index verwendet werden kann. Das man diesen aber nicht wie wild setzen sollte, ist denke ich klar.

Hat man diesen aber nicht, klappt die Schere zwischen den beiden sehr schnell auf. Das dürfte aber nicht sein, wenn beide das Gleiche täten. Ob es beim Index mit einer hinreichend großen Menge(>>3Mio) ebenfalls geschieht, weiß ich leider nicht.

Die von dir beschriebene Abfolge der Arbeitsweise trifft meiner Meinung nach eher auf das DISTINCT zu als auf GROUP BY, denn GROUP BY ist eine Aggregationsfunktion. Es wäre also doof, wenn da etwas wegfiele.

Von daher ist meiner Meinung nach immer ein DISTINCT zu verwenden.