Mehrdimensionales Array/MySQL
Mehrdimensionales Array/MySQL
am 12.02.2007 01:55:55 von Daniel Wanitsch
Hallo zusammen,
Ich stehe etwas auf dem Schlauch und es ist schon spät...
Zu meiner Situation und dem Problem:
Meine Tabellen in einer MySQL-DB sind:
kategorie
--> ID
--> katname
organisation
--> ID
--> orgname
shop
--> ID
--> shopname
links
--> ID
--> shopID
--> npoID
--> katID
--> url
Folgende MySQL-Abfrage (orgID ist als einziges von aussen gegeben):
"SELECT s.shopname, n.orgname, k.katname, r.url FROM links r LEFT JOIN
shop s ON s.shopID=r.shopID LEFT JOIN organisation n ON n.orgID=r.orgID
LEFT JOIN kategorie k ON k.kategorieID=r.katID WHERE r.orgID=2"
ergibt mir z.B. diese Werte-Tabelle:
shopname orgname katname url
supershop irgendeinname Bücher http://www.supershop.com
megashop irgendeinname Bücher http://www.megashop.com
gigashop irgendeinname Bücher http://www.gigashop.com
megashop irgendeinname Elektronik
http://www.megashop.com/electronics
supershop irgendeinname Elektronik
http://www.supershop.com/elektronik
megashop irgendeinname Haushalt
http://www.megashop.com/kitchen
supershop irgendeinname Haushalt
http://www.supershop.com/haushalt
Diese möchte ich nun nach Kategorie ausgeben:
1. Bücher von irgendeinname
2. Elektronik von irgendeinname
3. Haushalt von irgendeinname
etc..
Hier schon mal Danke fürs Durchlesen!!
Wie kann ich das nun am besten bewerkstelligen?
Ich weiss, dass es etwas komplex ist... deswegen bekomme ich es ja nicht
hin und leider bin ich in Sachen arrays und deren Verarbeitung alles
andere als sattelfest...
Muss ich möglicherweise das SQL-Statement dahingehend ändern, dass dort
schon eine Zusammenfassung der Kategorie stattfindet? Wenn ja, wie?
Danke für Hinweise und Tipps!
Gruss,
Daniel
Re: Mehrdimensionales Array/MySQL
am 12.02.2007 02:23:30 von Axel Schwenke
Daniel Wanitsch wrote:
> Meine Tabellen in einer MySQL-DB sind:
Hier wäre SHOW CREATE TABLE und Copy&Paste deutlich sinnvoller gewesen.
> kategorie
> --> ID
> --> katname
>
> organisation
> --> ID
> --> orgname
>
> shop
> --> ID
> --> shopname
>
> links
> --> ID
> --> shopID
> --> npoID
ob das wohl `orgid` sein soll?
> --> katID
> --> url
>
> Folgende MySQL-Abfrage (orgID ist als einziges von aussen gegeben):
>
> "SELECT s.shopname, n.orgname, k.katname, r.url FROM links r LEFT JOIN
> shop s ON s.shopID=r.shopID LEFT JOIN organisation n ON n.orgID=r.orgID
> LEFT JOIN kategorie k ON k.kategorieID=r.katID WHERE r.orgID=2"
Useless use of LEFT JOIN. Für praktische Zwecke kann man wohl als
gegeben annehmen, daß die `*ID` aus der `links` existierende Einträge
aus den anderen Tabellen referenzieren. Vermutlich wäre es wünschens-
wert, das durch entsprechende FOREIGN KEY Contraints sicherzustellen.
Und natürlich wären das dann jeweils INNER JOINs
> ergibt mir z.B. diese Werte-Tabelle:
Nochmal: Warum verwendest du nicht real existierende Daten und
Copy&Paste, um deinen Punkt darzustellen?
> shopname orgname katname url
>
> supershop irgendeinname Bücher http://www.supershop.com
> megashop irgendeinname Bücher http://www.megashop.com
> gigashop irgendeinname Bücher http://www.gigashop.com
> megashop irgendeinname Elektronik
> http://www.megashop.com/electronics
> supershop irgendeinname Elektronik
> http://www.supershop.com/elektronik
> megashop irgendeinname Haushalt
> http://www.megashop.com/kitchen
> supershop irgendeinname Haushalt
> http://www.supershop.com/haushalt
>
> Diese möchte ich nun nach Kategorie ausgeben:
>
> 1. Bücher von irgendeinname
>
>
>
>
> 2. Elektronik von irgendeinname
>
>
>
> 3. Haushalt von irgendeinname
>
>
Nicht eindeutig! Du willst anscheinend eine Aufzählung. Aber soll da
ein Punkt je Kategorie oder ein Punkt je Kombination aus Kategorie und
Shop-Name kommen oder was? Orgname ist ja offensichlich konstant.
> Wie kann ich das nun am besten bewerkstelligen?
Entweder formulierst du die SQL-Abfrage mit einer zusätzlichen WHERE
Bedingung für jede Kategorie einmal:
$kats = "SELECT id, name FROM kategorie"
foreach $kat from $kats {
$urls = "SELECT ... WHERE orgid=$orgid AND katid=$kat.id"
if $urls {
print "Angebote in $kat.name:"
foreach $url from $urls {
print $url.url;
}
}
}
oder (IMHO besser) du läßt dein Ergebnis nach Kategorie und - falls
gewünscht - nach Shop sortieren und wenn du dann das Ergebnis
durchläufst, machst du jedesmal einen neuen Aufzählungspunkt,
wenn sich einer der Werte ändert:
$urls = "SELECT ... WHERE orgid=$orgid ORDER BY katname, shopname"
$oldkat= $oldshop= ""
foreach $url from $urls {
if ($url.kat != $oldkat || $url.shop != $oldshop) {
print "Angebote von $url.shop in $url.kat"
$oldkat= $url.kat
$oldshop= $url.shop
}
print $url.url
}
XL
Re: Mehrdimensionales Array/MySQL
am 12.02.2007 10:54:01 von Gregor Kofler
Daniel Wanitsch meinte:
[snip]
> Hier schon mal Danke fürs Durchlesen!!
Das Ganze ist trotzdeme twas unklar - siehe Axels Anmerkung.
> Wie kann ich das nun am besten bewerkstelligen?
> Ich weiss, dass es etwas komplex ist... deswegen bekomme ich es ja nicht
> hin und leider bin ich in Sachen arrays und deren Verarbeitung alles
> andere als sattelfest...
> Muss ich möglicherweise das SQL-Statement dahingehend ändern, dass dort
> schon eine Zusammenfassung der Kategorie stattfindet? Wenn ja, wie?
Dein Query-Result solltest du passend sortieren. Der Rest ist simpel: In
der Schleife, in der die Datensätze geholt werden, einfach
kontrollieren, ob sich orgname und/oder katname geändert haben, und in
diesem Fall eine neue Überschrift einschieben.
Gregor
--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Re: Mehrdimensionales Array/MySQL
am 13.02.2007 12:26:50 von Daniel Wanitsch
Danke für die Rückmeldungen und Tipps!
Werde mich das nächste Mal mehr bemühen.
Beste Grüsse,
Daniel