[SQlite3] Inner join

Nalamar

Grünschnabel
Hallo ihr da draussen,

ich hab folgendes Problem:

Ich habe 3 Tabellen, die erste ist wie folgt aufgebaut:
Code:
CREATE TABLE pricekat (id integer primary key not null, name char(50));"
die 2. folgendermaßen:
Code:
"CREATE TABLE pricelist (id integer primary key not null, pid int, katid int, preis float);"
die 3. folgendermaßen:
Code:
CREATE TABLE produkte (id integer primary key not null, name char(50), kat tinyint);"

"Editiiert"
Die Kategorie-Tabelle enthält derzeit 3 Einträge, die Produkttabelle 6 Einträge, in der Preisliste steht zu jedem Produkt zu jeder Kategoerie der Preis.
"/Editiert"

Ausgeben möchte ich am ende ein Tabelle die pro Zeile die 3 Preise zu einem Produkt je nach kategorie angibt.

######Kat A ##### Kat B ##### Kat C
Prod A - Preis A ---- Preis B ---- Preis C
Prod B - Preis A ---- Preis B ---- Preis C

mit folgender Abfrage hatte ich gehofft diese 18 Ergebnisse zu erhalten:

Code:
"SELECT preis FROM produkte AS p INNER JOIN pricelist AS l ON p.id = l.pid;"

Allerdings erhalte ich statt der gehofften 18 ingesamt 24 Ergebnisse. Wo liegt der Fehler in meiner Überlegung und wie kann ich den korregieren, ich komm einfach nicht drauf!

Danke im Vorraus
 
Zuletzt bearbeitet:
Dir ist aber schon aufgefallen, dass Du die in dem SQL Statement genannte Tabelle Produkte in der Beschreibung darüber nicht erläuterst?

Grüße
 
hallo,
da du mehrere Zeilen in eine reihe bringen willst könntest du es mit 3 Joins machen und jeweils die katid angeben

PHP:
SELECT
p.ID,
pkl1.preis as Preiskat1,
pkl2.preis as Preiskat2,
pkl3.preis as Preiskat3
FROM  produkte AS p
JOIN pricelist AS plk1 ON plk1.id =p.pid and plk1.katid = 1
JOIN pricelist AS plk2 ON plk2.id =p.pid and plk2.katid = 2
JOIN pricelist AS plk3 ON plk3.id =p.pid and plk3.katid = 3

oder mit

PHP:
SELECT A, 
       LTRIM( SYS_CONNECT_BY_PATH( B, ', '), ', ') B 
FROM   ( SELECT A, 
                B, 
                ROW_NUMBER() OVER ( PARTITION BY A ORDER BY B ) N, 
                Count(*) OVER ( PARTITION BY A ) C 
         FROM   TABELLE ) 
WHERE  LEVEL = C 
START WITH N = 1 
CONNECT BY PRIOR A = A AND PRIOR N = N - 1
hierbei werden die Preise mit , getrennt ausgegeben.
P.S.: ich weiß nicht ob variante 2 auch bei mysql geht hab hier nur die oracle zum testen
 
Dir ist aber schon aufgefallen, dass Du die in dem SQL Statement genannte Tabelle Produkte in der Beschreibung darüber nicht erläuterst?

Grüße

Ja mir ist das Aufgefallen :D Ich wollte das thema nur nicht mit unnützen informationen überladen, die Produktnamen auslesen und die erste Spalte der Tabelle damit füllen ist nicht das Problem :D

hallo,
da du mehrere Zeilen in eine reihe bringen willst könntest du es mit 3 Joins machen und jeweils die katid angeben .... hierbei werden die Preise mit , getrennt ausgegeben.

Der Ansatz ist ja nicht Grundverkehrt, allerdings ist ja dann das Problem das mir die Dynamik flöten geht ... denn grundlegend sind das oben genannte nur meine Beispieldaten für die Entwicklung ... im Einsatz können das durchaus auch 7 8 Kategorien werden ....
Die Tabelle wird erzeugt aus Anzahl Produkte = Spalten und Anzahl Kategorien = Reihen + 1 für die Namen.

EDIT: Ich habe meinen ersten Beitrag nochmal überarbeitet um das ganze noch etwas klarer darzustellen!
 
Zuletzt bearbeitet:
Hi,

Deine Aufgabenstellen würde der Aufbau einer Kreuztabelle sein. Dafür gibt es afaik nix im SQL Standard und bei SQLite wahrscheinlich erst recht nix.

Ich würde das wie folgt lösen

1. Die Daten per JOIN laden und eine Hashliste Produkt -> Preisl bauen
2. Die Preistabelle laden
3. Die Preisliste iterieren und per Hashzugriff die Kreuztabelle aufbauen.

Grüße
gore
 
Ich danke euch für eure Antworten, an meinem Inner Join ist alles ok und es funktioniert exakt wie ich mir das ursprünglich gewünscht hatte .... das ich mehr als die gewünschten Ergebnisse erhalten habe lag schlicht und ergreifend daran, das ich bei einer anderen Funktion ein Query doppelt ausgeführt habe und damit die zusätzlichen Einträge erzeugt habe.
 
Zurück