Datenbank schreiben per Cron » Bestehende IDs überspringen

DaveThuet

Erfahrenes Mitglied
Guten Morgen,

ich habe eine kleine Frage, die für Euch Profis sicher nur ein müdes Lächeln ins Gesicht auslösen wird.

Ich Schreibe in meiner Datenbank am Ende des Monats per Cron, die besten Downloads aus der Tabelle "tbl_uploads" in eine separate Tabelle (tbl_monatdownloads). Nun hat dieses Tabelle bereits einige IDs und ich möchte dort natürlich nicht zweimal die selbe ID, darum hat ich die Spalte "id_uploads" dieser Tabelle als Index definiert. So weit alles Bestens.

Zu meinem Problem oder respektive zur Frage...
Ich Schreibe jeweils Ende des Monats die besten 6 Download IDs per Cron in die Tabelle "tbl_monatdownloads", wie kann ich den Cron (php angefügt) so verändern, dass wenn eine ID bereits vorhanden ist er automatisch die nächste ID schriebt? Das Klappt eigentlich ganz gut, das Problem ist nur das im Moment wenn eine ID bereits vorhanden ist, er diese auslässt (eigentlich OK) aber er schreibt mir nicht die 6 verfügbaren IDs rein in die "tbl_monatdownloads"! Also wenn er 2 überspringen musste, dann habe ich nur 4 Einträge anstatt 6 in meiner "tbl_monatdownloads". Ich hoffe Ihr versteht mein kleines Dilemma?

Hier noch der aktuelle Cronjob/Crontab/Cron der ausgeführt wird:
PHP:
<?php
// Monatsstatistik in neue Tabelle schreiben
set_time_limit(0);
ignore_user_abort(true);
// Connection statement
require_once('../../abc/xyz.php');
$query = mysql_query("SELECT id_uploads, monatsdownloads 
                      FROM tbl_uploads 
                      WHERE aktiv = 1 AND monatsdownloads > 0 
                      ORDER BY monatsdownloads DESC 
                      LIMIT 0,6");
$total = mysql_num_rows($query);
$i=0;
while($i < $total) {
$result = mysql_fetch_array($query);
$id_uploads = $result['id_uploads'];
$monatsdownload = $result['monatsdownloads'];
mysql_query("INSERT INTO tbl_monatdownloads (id_uploads, monatsdownload, datum) 
             VALUES ('$id_uploads','$monatsdownload',now())");
$i++;
}
?>

Klar ich könnte einfach nur die 15 des Monats auslesen lassen, anstatt 6 wie eingestellt, aber dann würde ich 9 IDs die Chance nehmen/sperren in einen anderen Monat in diese Statistik zu gelangen. Die Ausgabe in der Homepage sind immer nur die Top 6, hier der Link dazu. «Monatsdownloads Oktober»

Ich danke Euch wirklich für Eure Hilfe oder Lösungen meines Problems, da ich mit PHP leider nicht allzu viel Anfang kann.
 
Zuletzt bearbeitet:
SQL:
SELECT
    up.id_uploads, up.monatsdownloads
FROM tbl_uploads AS up
LEFT JOIN tbl_monatsdownloads AS down USING (id_uploads)
    WHERE up.id_uploads Is Null
    AND up.aktiv = 1
    AND up.monatsdownloads > 0
ORDER BY up.monatsdownloads DESC LIMIT 0, 6

Natürlich ungetestet!
Durch den JOIN auf den WERT "Is Null" werden nur die Datensätze ausgewählt die es noch nicht in der Monatstabelle gibt. So zumindest sollte es sein!
 
Guten Morgen tombe,

erstmals danke für deine rasche Hilfe.
Leider erhalte ich aber irgend einen MySQL-Fehler oder respektive eine Warnung:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /var/www/vhosts/...xyz.php on line 15

PHP:
<?php
// Monatsstatistik in neue Tabelle schreiben
set_time_limit(0);
ignore_user_abort(true);
//Connection statement
require_once('../../abc/xyz.php');
$query = mysql_query("SELECT up.id_uploads, up.monatsdownloads
					  FROM tbl_uploads AS up
					  LEFT JOIN tbl_monatsdownloads AS down USING (id_uploads)
					  WHERE up.id_uploads IS NULL
					  AND up.aktiv = 1
					  AND up.monatsdownloads > 0
					  ORDER BY up.monatsdownloads DESC LIMIT 0,6");
$total = mysql_num_rows($query);
$i=0;
while($i < $total) {
$result = mysql_fetch_array($query);
$id_uploads = $result['id_uploads'];
$monatsdownload = $result['monatsdownloads'];
mysql_query("INSERT INTO tbl_monatdownloads (id_uploads, monatsdownload, datum) 
			 VALUES ('$id_uploads','$monatsdownload',now())");
$i++;
}
?>
 
Mist zumindest ein Fehler war schonmal drin:

SQL:
WHERE up.id_uploads IS NULL

bitte ändern in

SQL:
WHERE down.id_uploads IS NULL

Nein es sind (mindestens) zwei Fehler:

SQL:
LEFT JOIN tbl_monatsdownloads

Hier ist der Tabellenname falsch!!

Wenn es nicht zu viele Daten in diner DB sind, kannst du diese dann vielleicht mal hier einstellen (oder auch nur einen Teil davon). Dann könnte ich es besser testen.
 
Zuletzt bearbeitet:
Hallo tombe,

Fantastisch, ja es hatte die zwei vermuteten Fehler drinnen. :)
Ich habe es dann angepasst und siehe da nach einem Test mit dem November funktioniert es Einwandfrei!
Besten dank für die rasche Hilfe.
 
Zurück