SELECT Abfrage mit Min und IF Problem
am 08.03.2006 21:59:05 von anikel
Hallo zusammen,
ich bastele schon seit Tagen an einer SELECT Abfrage rum. Vielleicht
könnt Ihr mir da weiterhelfen. In den Dokus habe ich nicht wirklich was
gefunden.
Es geht um ein Preisvergleichssystem.
Habe folgende Tabelle:
shopartikel:
id(*)
+ art_nr
+ shop_nr
+ preis
Ich brauch den kleinsten preis + artikel_nr und die dazugehörige shop_nr
für einen artikel.
Dazu kann es ja sein das ein Artikel in mehreren Shops gleich günstig
ist. Da würde ich gern vorher definieren welcher shop ausgesucht werden
soll. Und falls dieser Shop nicht der günstigste ist, soll der zweite
von mir definierte Shop(usw.) in der Ergebnistabelle auftauchen.
BEISPIEL:
IF shop_nr 1 is true goto ergebnis else
IF shop_nr 2 is true goto ergebnis else
IF shop_nr 3 is true goto ergebnis ......usw
Dabei soll 1 2 oder 3 je nach Wunsch geordnet werden können.
Ich hoffe ich hab mich nicht zu kompliziert ausgedrückt :-)
Bis jetzt habe ich folgendes hinbekommen:
---------------------------------------------------
drop table if exists temp;
create table temp
SELECT shopartikel.art_nr,
shopartikel.shop_nr,
shopartikel.preis
FROM shopartikel
WHERE shopartikel.art_nr="10"
;
drop table if exists temp1;
create table temp1
SELECT temp.art_nr, temp.shop_nr, temp.preis
FROM temp
WHERE temp.preis =
(
SELECT min(temp.preis)
FROM temp
);
SELECT * FROM temp1
WHERE temp1.shop_nr = "3"
(Hier komme ich nicht weiter. Hier müsste irgendwie ne IF Anweisung rein
, oder?)
--------------------------------------------------
Ich frage mich auch ob es die richtige Entscheidung war dieses Problem
über mehrere normale Tabellenerstellungen zu lösen. Gibt es da
vielleicht auch einen eleganteren Weg? Weil ich mir vorstellen kann, das
mehrere Abfragen Gleichzeitig, sich gegenseitig behindern könnten. ?
Vielen Dank!!!
Gruß anikel
Re: SELECT Abfrage mit Min und IF Problem
am 10.03.2006 03:59:44 von Mustafa Korkmaz
"anikel" schrieb im Newsbeitrag
news:dungiq$3ic$1@online.de...
> Hallo zusammen,
>
> ich bastele schon seit Tagen an einer SELECT Abfrage rum. Vielleicht könnt
> Ihr mir da weiterhelfen. In den Dokus habe ich nicht wirklich was
> gefunden.
>
> Es geht um ein Preisvergleichssystem.
> Habe folgende Tabelle:
>
>
> shopartikel:
> id(*)
> + art_nr
> + shop_nr
> + preis
>
>
>
>
> Ich brauch den kleinsten preis + artikel_nr und die dazugehörige shop_nr
> für einen artikel.
> Dazu kann es ja sein das ein Artikel in mehreren Shops gleich günstig ist.
> Da würde ich gern vorher definieren welcher shop ausgesucht werden soll.
> Und falls dieser Shop nicht der günstigste ist, soll der zweite von mir
> definierte Shop(usw.) in der Ergebnistabelle auftauchen.
Hmm im Prinzip brauchst du also nur eine zusätzliche Tabelle wo du die von
dir genannte Reihenfolge der Shops einträgst (z.B. shop_bewertung). Quasi
also als durchlaufende Nummerierung in welcher Reihenfolge die Shops von dir
präferiert werden. Falls die Reihenfolge der Shops abhängig von dem Artikel
ist (und nicht absolut), dann fügst du halt noch die art_nr in die
Bewertungs-Tabelle ein..
Also Fall 1.) Create Table shop_bewertung(id, shop_nr, sort_nr)
Erläuterung: Jede Shop bekommt eine eindeutige SORT_NR zugewiesen, wonach
sie präferiert werden.
Fall 2.) Create Table shop_bewertung(id, art_nr, shop_nr, sort_nr)
Im ersten Fall würde die Abfrage dann so aussehen:
SELECT * FROM(
SELECT artikelpreise.* FROM(
SELECT s.art_nr, s.shop_nr, s.preis FROM shopartikel s,
(SELECT art_nr, min(preis) as minimum_preis FROM shopartikel GROUP
BY art_nr) t
WHERE s.art_nr = t.art_nr AND s.preis = t.minimum_preis
) as artikelpreise
LEFT JOIN shop_bewertung ON artikelpreise.shop_nr =
shop_bewertung.shop_nr ORDER BY sort_nr)
as fertig
ORDER BY art_nr
-> Ergebnis: Eine Tabelle die für jeden Artikel den günstigsten Preis
anzeigt, dabei die Reihenfolge nach Bewertung des Shops setzt, und alles
nochmal nach der Artikelnummer sortiert. (Falls nicht erforderlich kann man
den ersten SELECT und die letzte Order BY-Klausel weglassen)
Im zweiten Fall würde es nur eine geringfügige Änderung geben:
SELECT * FROM(
SELECT artikelpreise.* FROM(
SELECT s.art_nr, s.shop_nr, s.preis FROM shopartikel s,
(SELECT art_nr, min(preis) as minimum_preis FROM shopartikel GROUP
BY art_nr) t
WHERE s.art_nr = t.art_nr AND s.preis = t.minimum_preis
) as artikelpreise
LEFT JOIN shop_bewertung ON artikelpreise.shop_nr =
shop_bewertung.shop_nr
AND artikelpreise.art_nr = shop_bewertung.art_nr ORDER BY sort_nr)
as fertig
ORDER BY art_nr
Getestet auf Postgresql -> funktioniert.
Gruß
M.K.