PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage LEFT JOIN verdreht die Plausibilitäten


Franzx
25.11.2005, 13:19:15
... habe Verständnisproblem??

Folgende Abfrage erzeugt die richtige Datenmenge und die nötigen Plausibilitäten werden über PHP abgefragt. Es funktioniert soweit.
$result = mysql_query("SELECT * FROM tbl1, tbl2 WHERE tbl1.Wert = tbl2.Wert AND tbl1.Wert2 >= '".$_POST['AUSWAHL']."' ORDER BY tbl1.Wert LIMIT 50") or die(mysql_error());
while($row = mysql_fetch_array($result)){...

Nun ist es aber so, dass eine 3te tbl abgefragt werden muss, ob eine entsprechende ID vorhanden ist. Wenn ja soll diese mit dem Datensatz der beiden anderen DB verbunden und ausgegeben werden.
Benutze ich nun folgende Anweisung werden die Plausis, die per PHP geprüft werden, verändert.

$result = mysql_query("SELECT * FROM tbl1, tbl2 LEFT JOIN tbl3 ON ('tbl1.ID' = 'tbl3.ID') WHERE tbl1.Wert = tbl2.Wert AND tbl1.Wert2 >= '".$_POST['AUSWAHL']."' ORDER BY tbl1.Wert LIMIT 50") or die(mysql_error());
while($row = mysql_fetch_array($result)){...

Was mache ich falsch?

cu,
Franzx

Franzx
06.12.2005, 09:23:45
Neuer Lösungsversuch:

$result = mysql_query("SELECT * FROM tbl1, tbl2, tbl3 WHERE tbl1.cnt = tbl3.cnt AND tbl1.id >= '".$_POST['BLOCKAUSWAHL']."' GROUP BY tbl1.id LIMIT 50") or die(mysql_error());

Aus tbl1, tbl2 werden alle Felder richtig ausgegeben. tbl1 und tbl2 haben die gleiche Anzahl von Zeilen und jede ID ist in jeder der beiden tbl vorhanden, also eine einfache Standardabfrage.

In tbl3 allerdings gibt es nur wenige Datensätze, die allerdings, sofern vorhanden auch über die eindeutige id zuordenbar sind.

Leider gibt nun aber der query nur die Infos aus dem ersten gefundenen Datensatz, sprich die id aus allen drei tbl ist gleich, aus der tbl3 zurück und wiederholt diesen für jeden weiteren Datensatz

Also es werden schon alle vorhandene Datensätze ausgegeben, doch aus tbl3 nur der erst gefundene und dieser wird dann fälschlicherweise mit den sonst übereinstimmenden id's verknüpft.
INNER Join hilft mir dabei nicht weiter, da dann nur die Datensätze aus entweder oder ausgegeben werden.
LEFT Join hilft nicht weiter, da da zwar in der Anzahl der Datensätze alles richtig ist, es werden allerdings keine Werte übermittelt, ich meine {$row['Wert_aus_tbl3']} ist leer.

Hat jemand eine Idee.
Gruß,
Franzx

xabbuh
06.12.2005, 10:09:20
Könntest du mal die Strukturen der drei Tabellen und ein paar Beispieldatensätze zeigen und dann daran erklären, wie das Ergebnis deiner Abfrage aussehen soll?

Franzx
06.12.2005, 10:52:55
... tbl1 hat 40 Felder - überwiegend Datumsfelder
Feld1 = ID [varchar]; Feld2 = Produktbeschreibung [longtext]; Feld3 = cnt [smallint]; danach Datumsfelder die sich nur im Feldnamen unterscheiden wie Einkauf; Preisänderung; Preisänderung2; Preisänderung3; Produkterneuerung; ...

tbl2 hat 3 Felder
Feld1 = cnt[int]; Feld2 = Hersteller [char255]; Feld3 = Gebiet [char50]

tbl3 ist wie die tbl1 aufgebaut beinhaltet aber einfach nur spezielle Produkte die nur dann in Frage kommen wenn eben in der Tabelle 1 kein Produkt, nur 1 Produkt oder nur sehr alte Produkte zur Verfügung stehen.

Abgefragt wird der gesamte Datensatz aus allen Feldern. Bei dieser Abfrage wird schon geprüft, bzw. soll schon geprüft werden ob eben auch in tbl3 ein Wert eingetragen ist, damit gegebenenfalls auch diese Werte zur Verfügung stehen und ausgegeben werden sollen.
Ob letzendlich ein Datensatz angezeigt und welche Felder daraus angezeigt werden sollen, löse ich in PHP indem ich eben auf {!empty($row['datumsfeldx']} oder {empty($row['datumsfeld1']} abfrage.
Somit kann ich ein html-template verwenden und bestimme durch die Abfragen ob es angezeigt wird und was, welche Felder, angezeigt werden.

xabbuh
06.12.2005, 11:41:50
Versuch mal sowas:

SELECT
...
FROM
tbl1
INNER JOIN
tbl2
ON
tbl1.cnt = tbl2.cnt
LEFT OUTER JOIN
tbl3
ON
tbl1.cnt = tbl3.cnt

Franzx
06.12.2005, 12:19:59
Phantastisch :-)

Es funktioniert!

Vielen Dank!

Gruß,
Franzx