PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : result Variablen von SQL verbinden



vci
28-01-2010, 11:02
Hallo zusammen,

ich sitze hier vor einem SQL-Problem und würde es gerne elegant lösen.
Es geht darum 3 Abfragen zu machen, und wenn jeweils eine Abfrage leer ist eine andere Abfrage zu machen. D.h. UNION funktioniert nicht, da man hier ja eben nicht leere Teilmengen abfangen kann (oder doch?)

Im Moment würde der Code dann so aussehen:
Abfrage 1 - IF-Teil-Abfrage 1
Ausgabe Abfrage
Abfrage 2 - IF-Teil-Abfrage 2
Ausgabe Abfrage
Abfrage 3 - IF-Teil-Abfrage 3
Ausgabe Abfrage

Wobei Ausgabe der Abfrage immer der gleiche Code ist. Das wird natürlich extrem unschön, wenn die Ausgabe der Abfrage 50 Zeilen sind :-)

Was ich nun suche ist Folgendes:


// Abfrage 1
$sql = select ...
$result1 = mysql_query($sql, $db);
if (!$result) $sql = select andere Abfrage;
// Abfrage 2
$sql = select ...
$result2 = mysql_query($sql, $db);
if (!$result2) $sql = select andere Abfrage;
// Abfrage 3
$sql = select ...
$result3 = mysql_query($sql, $db);
if (!$result3) $sql = select andere Abfrage;
// Zusammenfuehren:
$result = $result1.$result2.$result3
// Ausgeben
while ($myrow = mysql_fetch_array($result) {
...
}


Leider funktioniert das so nicht. Gibt es irgendwie eine Append-Row-Funktion in PHP? Mit SQL-Mitteln laesst sich die Abfrage leider wirklich nicht hinbiegen!

Natuerlich ist die Anzahl und Bezeichnung der Felder gleich!

undefined
28-01-2010, 11:11
Solche Probleme löst man mit SQL JOIN Syntax und nicht mit PHP ;)
An sonsten hilft nur die neue $pdo->mysql, die kann mit Prozedural Syntax umgehen.

vci
28-01-2010, 11:27
Also ich denke nicht, dass das Problem sich mit einer SQL-Abfrage erschlagen lässt. Das Problem ist eben nicht die Abfrage als solches zu Verknüpfen, sondern im "Fehlerfall" dann eine andere Abfrage zu machen.

Konkret soll es darum gehen, dass immer mehrere Werte eines Eintrages ausgegeben werden wenn der Eintrag > aktuelles Datum ist. Ist dieser Eintrag nicht vorhanden soll eine 2. Abfrage gemacht werden die den 1. Eintrag < aktuelles Datum zurückliefert.

Also eben:
select name,ort,adresse,mail from events where datum > curdate();
if empty: select name,ort,adresse,mail from events where datum < curdate();

Es handelt sich dabei um Veranstaltungen. So soll z.B.:
SchokoladenKonferenz Mai 2008
SchokoladenKonferenz Oktober 2009
SchokoladenKonferenz Juli 2010
SchokoladenKonferenz Juni 2011

Beispiele:
Sind wir im Juni 2008 soll die Konferenz von Oktober 2009 ausgegeben werden. Sind wir im Oktober 2011 und ein neuer Eintrag für 2012 existiert noch nicht, soll die Konferenz von 2011 ausgegeben werden (das wäre der Sonderfall, wenn die 1. Abfrage leer ist).

Dabei geht es nicht nur um SchokoladenKonferenz sondern zusätzlich noch um PralinenKonferenz und EisKonferenz. #Edit: Es sollen also immer *genau* die 3 "richtigen" Konferenzen ausgegeben werden und nicht mehr und nicht weniger :-)

Wie soll das mit JOIN funktionieren?!
Bin total ratlos und zugegeben auch PHP/SQL Neuling :-)

undefined
28-01-2010, 13:35
Aber hallo, natürlich ist das ein reines SQL Problem ;)
Das fängt schon beim SQL Modell an.
Ich nehme jetzt mal an das du für jedes Event / Konferenz Type, wie auch immer eine Extra Tabelle machst. Das heißt für mich du brauchst Eigentlich eine Referenz Tabelle.
Notfalls kannst du das auch so machen. (Nicht getestet frei...)


START TRANSACTION;
SET @current := NOW();
SET @stamp := DATE_ADD(@current, Interval 3 month );
SELECT DISTINCT ROW
a.*, b.*, c.*
FROM tabelle_a AS a
LEFT JOIN tabelle_b AS b
LEFT JOIN tabelle_c AS c
WHERE (
( a.datum > @current AND a.datum < @stamp )
OR ( b.datum > @current AND b.datum < @stamp )
OR ( c.datum > @current AND c.datum < @stamp )
)
ORDER BY a.datum, b.datum, c.datum ASC LIMIT 3;
COMMIT;

Die SQL wird bei den ersten 3 treffern beendet.

vci
28-01-2010, 18:20
Ne das ist leider alles eine Tabelle (Vorgabe, kann ich nicht aendern).
D.h. die Abfrage ist immer ein: where category='Konferenz.Schokolade' ...

undefined
29-01-2010, 12:34
Um so einfacher, dann kannst du dir den JOIN Syntax sparen und über WHERE Klausel arbeiten.