sql/php: Komplizierte Abarbeitung für eine Sitemap :(

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
Wuppi
Mitglied
Beiträge: 734
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

sql/php: Komplizierte Abarbeitung für eine Sitemap :(

Beitrag von Wuppi »

Hi

ich hab mal wieder eine komplizierte SQL-Abfrage - bzw. Weiterverarbeitung vor.

Grundlage ist diese Abfrage:

Code: Alles auswählen

SELECT ID, MID, COUNT(ID) AS anzahl, MAX(time) AS neuste FROM dbase1 GROUP BY ID, MID
Das Ergebnis sieht dann so aus:

Code: Alles auswählen

ID 	MID 	anzahl 	neuste
1 	3 		6 	1352730607
2 	1 		7 	1354709044
2 	3 		336 	1352477062
Hat mir eigentlich gereicht. Bis ich erkannt habe, das IDs 1-3x vorhanden sein können.

Sinn ist es aus diesen Angaben eine Sitemap zu basteln
Anzahl/15 (aufgerundet) = Seitenzahl

Mit der Ausgabe oben sehen die links in der Sitemap dann also so aus:

/index.php?ID=2&MID=1
/index.php?ID=2&MID=3
/index.php?ID=2&MID=3&seite=2
/index.php?ID=2&MID=3&seite=3 ....

Offensichtlich richtig. Jetzt kam der eigentlich Fehler zu tage:
Problem ist eine komplizierte Verschachteltung wenn mehre MID vorhanden sind.

Ist zu einer ID nur ein MID vorhanden lautet die URL
/index.php?ID=2 <- das ganze landet in einem Menu namens Übersicht ... hier stehen dann ALLE MID's drin - ab 15 Einträge dann halt mit Pagination.

Sind zu einer ID aber 2 MIDs vorhanden sieht das ganze so aus:
/index.php?ID=2 <- Übersicht -> hier sieht man zu jeder MID die Top 5 Einträge (!)
/index.php?ID=2&MID=1 <- Menu MID 1
/index.php?ID=2&MID=3 <- Menu MID 3

Fehler erkannt?
Nach meinem ersten Ansatz muss ich ID und MID in die Sitemap hauen => Ist aber nur EINE MID vorhanden, hau ich hier für 20 Seiten, 20 Links mit MID=3 rein ... ich schreibe also Links in die Sitemap die zwar funktionieren, aber nicht richtig sind (hab canonicals drin, die dieser Sitemap dann widersprechen würden; ok canonicals sind dafür da den richtigen Content zu markieren - aber ich hätte es doch gerne sauber übermittelt).


Meine IDEE war nun ... ich brauche ein erweitertes Ergebnis:

Code: Alles auswählen

ID 	MID 	anzahl 	neuste	anzahlMID
1 	3 		6 	1352730607	1
2 	1 		7 	1354709044	2
2 	3 		336 	1352477062	2
Damit könnte ich die passenden Links erstellen in dem ich anzahlMID abfrage: ist 1 dann ?ID=2; ist 2 dann ?ID=2, ?ID=2&MID=1, ?ID=2&MID=3

Nur wurde mir schon angedeutet das ich so eine Ausgabe auf Basis meiner Abfrage oben nicht hinbekomme. Wir könnte ich das sonst hin bekommen?

Ich hoffe ihr habt das Problem verstanden? ;)

IDs könnten mehrere HUNDERT sein. MIDs derzeit nur 3.

Die Sitemap wird in der Nacht erstellt - also dann wenn bissel mehr CPU/DB-Power vorhanden ist ;). Wenn ich pro 1000 IDs also 500ms für das Script investieren muss, ist das so! Ich brauche also nur eine funktionable Lösung - nicht zwingend eine Highperformance-Lösung ;). Mein Hardcoregedanke wäre ja obere Abfrage - dann zur Ausgabe eine While - und da drin eine num_row-DB-Abfrage ... nur bei 1000 IDs sind das dann auch 1000 Abfragen - das ist etwas ZU BRUTAL! Bissel Harmloser darf es sein ;)

Danke
Grüße
Wuppi
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: sql/php: Komplizierte Abarbeitung für eine Sitemap :(

Beitrag von Miriam »

Du brauchst nur 1 Abfrage, mußt dann aber noch etwas mehr zur Auswertung tun.

Ich mach es mal phpBB3 Style:

Code: Alles auswählen

$sql = 'SELECT ID, MID from ' . YOUR_DEFINED_TABLENAME . '
        ORDER BY ID ASC';
        
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    $data[$row['ID']][] = $row['MID'];
}
foreach ($data as $key => $value)
{
    print 'ID #' . $key . ' hat: ' . count($value) . ' MIDs<br /><br />';
}

$db->sql_freeresult($result);
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
Wuppi
Mitglied
Beiträge: 734
Registriert: 14.05.2002 23:04
Wohnort: Köln
Kontaktdaten:

Re: sql/php: Komplizierte Abarbeitung für eine Sitemap :(

Beitrag von Wuppi »

Vielen Dank!

sieht einfach aus. Ich schau mir das die Tage mal an - ich hab jetzt erstmal die "Workaround"-Lösung gebastelt (je ID = 1 Link; ist nicht falsch, aber unvollständig), kann gerade keine Sitemaps mehr sehen - echt monströs (es werden mehrere Sitemaps einer Seite erstellt) mein Sitemap-Generator ;)

Dein $sql kann ich natürlich um meinen kompletten String erweitern (also mit count, max, group by)?

phpBB3-Style ist etwas doof - unser Projekt hat leider (!) nichts mit phpBB3 zu tun :( ... [aber ich weiß das hier fähige Leute sind - deswegen frag ich hier sehr gerne!]

$db->sql_query => mysql_query
$db->sql_fetchrow($result) => mysql_fetch_row
$db->sql_freeresult($result) => ok - hier kommt jetzt glaub raus das ich Quick&Dirty code? ;) wie sieht die nicht-phpBB3-Variante dafür aus?
$data[$row['ID']][] = $row['MID']; => noch mal outing ... 2-Dimensionalles Array oder sowas? Auf jedenfall "Standard-PHP" und nicht phpBB3?

Noch mal danke ... und wie gesagt: effektiv testen werde ich das die nächsten Tage mal - wenn ich mich wieder traue diese php-Datei zu öffnen!

Gruß
Wuppi
Benutzeravatar
Miriam
Mitglied
Beiträge: 12310
Registriert: 13.10.2004 07:18
Kontaktdaten:

Re: sql/php: Komplizierte Abarbeitung für eine Sitemap :(

Beitrag von Miriam »

Wuppi hat geschrieben:2-Dimensionalles Array oder sowas?
Mach mal print_r($data); und Du siehst es.

Du kannst mit der Variablen $sql machen, was und wie Du möchtest. Darfst s'e auch behalten :-P
Gruss, Miriam.
Ich schmeiß' alles hin und...
... lasse es liegen
Benutzeravatar
Mungo
Administrator
Administrator
Beiträge: 6613
Registriert: 03.05.2003 19:34

Re: sql/php: Komplizierte Abarbeitung für eine Sitemap :(

Beitrag von Mungo »

Wuppi hat geschrieben:Meine IDEE war nun ... ich brauche ein erweitertes Ergebnis:

Code: Alles auswählen

ID 	MID 	anzahl 	neuste	anzahlMID
1 	3 		6 	1352730607	1
2 	1 		7 	1354709044	2
2 	3 		336 	1352477062	2
Bekommst du mit:

Code: Alles auswählen

SELECT t1.id, t1.mid, COUNT(t1.id) AS anzahl, MAX(t1.time) AS neuste, rt.mid_anzahl
FROM dbase1 t1
LEFT JOIN
(SELECT t2.id, COUNT(DISTINCT t2.mid) AS mid_anzahl FROM dbase1 t2 GROUP BY id) rt
ON t1.id = rt.id
GROUP BY t1.id, t1.mid
Antworten

Zurück zu „Coding & Technik“