php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.07.2011, 17:36  
Neuer Benutzer
 
Registriert seit: 08.11.2010
Beiträge: 14
PHP-Kenntnisse:
Anfänger
MeckiDerIgel befindet sich auf einem aufstrebenden Ast
Standard DB Abfrage mit 2 LEFT JOIN und 2 WHERE BEDINGUNGEN - oder einfacher?

Hallo liebes Forum,

ich bastel gerade an einer Datenbankabfrage und komme nicht so recht weiter. Ich würde die Daten gern in einer Abfrage aus der DB holen, vielleicht ist das aber so auch garnicht möglich. Schatuts euch doch bitte mal an, falls ihr etwas Zeit habt:

Ausgangssituation: Eine Seite besteht aus mehreren Boxen. D.h., dass eine Box feste Positionsdaten auf der Seite hat. Außerdem kann eine Box entweder nur auf einer Seite auftauchen (zB einfacher Textcontent), oder auf mehreren, oder auf allen Seiten (z.B. die Navigation).

Struktur der DB-Tabellen: (etwas vereinfacht)
Code:
pageIndex(pageID, title); [t1]
boxIndex(boxID, position, contentID, allPages[BOOL]); [t2]
boxReferences(referenceID, boxID, pageID); [t3]
Die Tabelle boxReferences enthält also die Zuordnungen von einer Box an eine oder mehrere Seiten. Die DB-Abfrage dafür (Seite mit allen dazugehörigen Boxen) sollte wohl in etwa so aussehen:

Abfrage:

Code:
SELECT t1.pageID, t1.title, t2.position, t2.contentID, t2.allPages, t3.referenceID, t3.boxID
FROM (pageIndex AS t1 LEFT JOIN boxReferences AS t3 ON t1.pageID = t3.pageID)
LEFT JOIN boxIndex AS t2 ON t3.boxID = t2.boxID
WHERE t1.pageID = ?
Soweit so gut, jetzt hätte ich alle Boxen, die auf dieser Seite vorkommen außer denen, die auf allen Seiten vorkommen (boxIndex.allPages = true).

Gibt es eine Möglichkeit, mit LEFT JOIN auf diese Weise vorzugehen und in der selben Abfrage zusätzlich alle Einträge aus boxIndex zu holen, bei denen allPages = true ist, oder muss ich dafür zwei Abfragen machen, bzw. meine DB-Struktur ändern?

Ich grübel schon etwas länger darüber, wäre schön, wenn mir da ein etwas erfahrenerer User helfen könnte!
MeckiDerIgel ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.07.2011, 17:52  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Vielleicht erkenne ich dein Problem nur nicht aber was ist mit:
Code:
WHERE t1.pageID = ? AND t2.allPages = 0
Übrigens, du tust dir und jedem anderen der über dem Code grübeln muss einen großen Gefallen wenn du deine Aliase etwas sprechender gestaltest. So springt man ja ständig hin und her: "was war jetzt nochmal t2 und was t3?"
fab ist offline   Mit Zitat antworten
Alt 24.07.2011, 18:09  
Neuer Benutzer
 
Registriert seit: 08.11.2010
Beiträge: 14
PHP-Kenntnisse:
Anfänger
MeckiDerIgel befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Übrigens, du tust dir und jedem anderen der über dem Code grübeln muss einen großen Gefallen wenn du deine Aliase etwas sprechender gestaltest. So springt man ja ständig hin und her: "was war jetzt nochmal t2 und was t3?"
Danke für den Tipp.

Zu deinem Vorschlag: Die Abfrage soll als Ergebnis ja all die Boxen liefern, die über eine Referenz mit der entsprechenden Seite verknüpft sind + die Boxen, welche allPages = 1 haben (und die, da sie ja auf jeder Seite sind, keine zusätzlichen Einträge mehr in boxReferences haben.

Wenn man an den Befehl aber einfach das WHERE boxIndex.allPages = 1 anfügt, dann werden doch nur die Ergebnisse mit der WHERE Bedingung gefiltert, die durch das LEFT JOIN schon ausgewählt wurden (und da sind die mit allPages = 1 ja nicht mehr dabei).
MeckiDerIgel ist offline   Mit Zitat antworten
Alt 24.07.2011, 18:22  
fab
Erfahrener Benutzer
 
Benutzerbild von fab
 
Registriert seit: 28.07.2010
Beiträge: 2.308
PHP-Kenntnisse:
Fortgeschritten
fab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblickfab ist ein Lichtblick
Standard

Ah, ich habe dich genau anders herum verstanden

Zitat:
Soweit so gut, jetzt hätte ich alle Boxen, die auf dieser Seite vorkommen außer denen, die auf allen Seiten vorkommen (boxIndex.allPages = true).
Zitat:
Die Abfrage soll als Ergebnis ja all die Boxen liefern, die über eine Referenz mit der entsprechenden Seite verknüpft sind + die Boxen, welche allPages = 1 haben
Wie auch immer, in dem Fall könntest du die Bedingung bei ON aufnehmen anstatt bei WHERE:

Code:
LEFT JOIN boxIndex AS t2 ON t3.boxID = t2.boxID OR t2.allPages = 1
Da du vorher bereits einen JOIN auf boxReferences gemacht hast, und die Einträge mit allPages=1 nun mehrfach selektiert werden wird noch ein GROUP BY t2.id am Ende fällig. Aus dem selben Grund ist die Abfrage leider auch nicht so performant und ich würde mir überlegen, den allPages-Flag bereits in boxReferences unterzubringen

Code:
boxReferences
 referenceID
 boxID
 pageID
 allPages
Hier kommt dann für die Boxen, die überall auftauchen sollen, ein Eintrag ohne pageID hin und stattdessen allPages=1 (kannst dir das Feld sogar sparen und pageID=NULL für diesen Fall benutzen)

Der erste JOIN sieht dann so aus:
Code:
LEFT JOIN boxReferences AS t3 ON t1.pageID = t3.pageID OR t3.allPages = 1
bzw.
Code:
LEFT JOIN boxReferences AS t3 ON t1.pageID = t3.pageID OR t3.pageID IS NULL
fab ist offline   Mit Zitat antworten
Alt 24.07.2011, 18:27  
Neuer Benutzer
 
Registriert seit: 08.11.2010
Beiträge: 14
PHP-Kenntnisse:
Anfänger
MeckiDerIgel befindet sich auf einem aufstrebenden Ast
Standard

Herrlich, darauf, dass man diese Bedingung auch hinter dem ON einbauen kann, bin ich garnicht gekommen. Werds direkt versuchen.
Also dann soweit erstmal vielen Dank für deine Hilfe!
MeckiDerIgel ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
sql abfrage unterschied where, join kaptainIglo Datenbanken 8 15.06.2011 13:09
[Erledigt] Left Join robydog PHP Einsteiger 2 25.04.2011 10:15
SQL Abfrage INNER JOIN etc. chr1s-eg Datenbanken 4 01.03.2011 13:37
OUTER JOIN Abfrage, die evtl. keine Treffer zurückgeben könnte noop Datenbanken 1 27.01.2011 20:23
Problem mit Mysql Left Join Ambfrage pro-tech Datenbanken 11 22.05.2010 10:59
mysqli_multi_query lässt Eintrag aus... Samhayne Datenbanken 8 07.02.2010 19:02
[Erledigt] SQL Anweisung sadry PHP Tipps 2009 38 20.08.2009 11:28
[Erledigt] LEFT JOIN Daten ausgeben bei 1:n Beziehung Asipak PHP Tipps 2009 11 01.08.2009 15:27
JOIN und LEFT JOIN verbinden? Dynamite53 Datenbanken 8 15.05.2009 15:16
Persistence Framework #Avedo Software-Design 37 28.03.2009 17:32
[Erledigt] Left join und inner join stefanjann Datenbanken 7 16.10.2008 15:45
SELECT-Abfrage optimieren pz6j89 Datenbanken 14 17.04.2008 17:37
den letzte(grösten) eintrag aus LEFT JOIN Datenbanken 2 24.07.2004 18:33
[Erledigt] Mehrere COUNT(*) in einer Abfrage mit LEFT JOIN Datenbanken 8 18.06.2004 13:43
SQL Abfrage mit LEFT JOIN -> OK, aber ich komm net weiter PHP-Fortgeschrittene 3 04.06.2004 00:37

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
2 left join, left join mehrere bedingungen, mehrfacher left join, mehrere joins in einer abfrage, sql \left join\ \mehrere bedingungen\, sql left join \mehrere bedingungen\, left join und join wo kommt die on bedingung hin, zwei left joins, sql left join mehrere bedingungen, left join zwei bedingungen, left join on mehrere bedingungen, left join mit 2 bedingungen, php zwei left join abfragen in einer select, mehrere bedingungen in den join oder where, 2 left join in einer abfrage, php datenbank where anweisung mit 2 bedingungen, left join mit mehreren where bedingungen, db anfrage bedingung, db 2left inner join, php left join zwei bedingungen

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:13 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum