UNION mit PHP?

Hallo,

seit MySQL 4.0 ist jetzt wohl auch der UNION-Befehl möglich. Aber leider scheint der nur in Verbindung mit mehreren SELECT-Anweisungen zu funktionieren. Gibt es etwas vergleichbares auch für PHP?

Ich möchte nämlich folgendes Problem lösen:
Über mehrere If-Elseif-Anweisungen erhalte ich letztendlich 3 Ergebnisse (query1, query2 und query3). Bislang werden diese 3 Ergebnisse als drei Listen in einer PHP-Seite ausgegeben. Ziel ist es, dass eine Ergebnisliste ausgegeben wird, die nur die Datensätze enthält, die in allen 3 einzelnen Listen enthalten sind.
Soweit ich es verstanden habe, könnte ich 3 Select-Anweisungen problemlos mit UNION verknüpfen. Allerdings kann ich im Vorfeld nicht sagen, welche von 8 möglichen Select-Anweisungen zu einer Ergebnisliste führt. Daher wäre es doch sehr aufwändig, wenn ich alle möglichen Kombinationen mit UNION erstellen würde.

Gibt es eine Möglichkeit (z.B. ähnlich dem: $result1 = mysql_query($query1)), um die Schnittmenge aus den Ergebnissen query1, query2 und query3 zu erhalten?

Bin über jeden Tipp dankbar.

Viele Grüße
Merlinchen

Hallo Merlinchen,

Ich möchte nämlich folgendes Problem lösen:
Über mehrere If-Elseif-Anweisungen erhalte ich letztendlich 3
Ergebnisse (query1, query2 und query3). Bislang werden diese 3
Ergebnisse als drei Listen in einer PHP-Seite ausgegeben. Ziel
ist es, dass eine Ergebnisliste ausgegeben wird, die nur die
Datensätze enthält, die in allen 3 einzelnen Listen enthalten
sind.
Soweit ich es verstanden habe, könnte ich 3 Select-Anweisungen
problemlos mit UNION verknüpfen. Allerdings kann ich im
Vorfeld nicht sagen, welche von 8 möglichen Select-Anweisungen
zu einer Ergebnisliste führt. Daher wäre es doch sehr
aufwändig, wenn ich alle möglichen Kombinationen mit UNION
erstellen würde.

Das hört sich fast so an, als sei es mittels JOIN lösbar.
Poste mal die Struktur Deiner Datenbank (Tabellen, relevante
Feldbezeichner und -Typen) und die drei Queries,
die Du derzeit verwendest.

Infos zum JOIN: http://dev.mysql.com/doc/mysql/de/JOIN.html

Gruss
Thomas

Hallo,

seit MySQL 4.0 ist jetzt wohl auch der UNION-Befehl möglich.
Aber leider scheint der nur in Verbindung mit mehreren
SELECT-Anweisungen zu funktionieren. Gibt es etwas
vergleichbares auch für PHP?

nur fuer mich:

SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
 [UNION [ALL | DISTINCT]
 SELECT ...]

UNION is used to combine the result from many SELECT statements into one result set. UNION is available from MySQL 4.0.0 on.

also ich lese daraus: mache 3 select-querys in einer anfrage und gib mir ein result zurueck

ergo in php:

$res = mysql\_query("select ... union select ...")

Ich möchte nämlich folgendes Problem lösen:
Über mehrere If-Elseif-Anweisungen erhalte ich letztendlich 3
Ergebnisse (query1, query2 und query3). Bislang werden diese 3
Ergebnisse als drei Listen in einer PHP-Seite ausgegeben. Ziel
ist es, dass eine Ergebnisliste ausgegeben wird, die nur die
Datensätze enthält, die in allen 3 einzelnen Listen enthalten
sind.

aha also nicht die gesamtmenge sondern die schnittmenge, dann ist aber union das falsche, nicht?

Soweit ich es verstanden habe, könnte ich 3 Select-Anweisungen
problemlos mit UNION verknüpfen. Allerdings kann ich im
Vorfeld nicht sagen, welche von 8 möglichen Select-Anweisungen
zu einer Ergebnisliste führt.

dann musst du das ja eh in der applikation lösen, und kannst es nicht von der db machen lassen.

ein paar ideen:
a) das vom vorposter empfohlenen join
b) subselects die es ja wohl in myql 4 geben soll
c) in der applikation:

if ( ! $menge1 = dbQuerySingleCol("select id from ... where bedingung"))
 { $menge1 = dbQuerySingleCol("select id from ... where andere bedingung"); }

$untermenge = dbQuerySingleCol("select from .... where id in (".implode(',',$menge1).")")

wobei letztere vielleicht nicht die performanteste loesung ist, aber du hast halt die moeglichkeit deine 8 abfragen ergebnisabhaengig weiter zu verarbeiten.

Details
Hallo Thomas,

Das hört sich fast so an, als sei es mittels JOIN lösbar.
Poste mal die Struktur Deiner Datenbank (Tabellen, relevante
Feldbezeichner und -Typen) und die drei Queries,
die Du derzeit verwendest.

Infos zum JOIN: http://dev.mysql.com/doc/mysql/de/JOIN.html

In folgender Art habe ich insgesamt 24 Select-Anweisungen incl. Ausgabe:
$query3 = „SELECT Nr, $suchfelder FROM rbartikel WHERE Kategorie Like ‚%$Eingabe6%‘“;
$result3 = mysql_query($query3) or die(„Anfrage fehlgeschlagen“);
print „“;
print " Nr";
foreach($Ausgabe as $feld)
{ print " $feld";
}
while ($line = mysql_fetch_array($result3, MYSQL_ASSOC))
{ print „“;
foreach ($line as $col_value)
{ print „$col_value“;
}
print „“;
}
print „“;

So wie es hier einmal „$query3“ und „$result3“ gibt, hab ich das noch mal mit 1 und 2 - also dreimal je 8 Select-Anweisungen. Jeder der Results wird ausgegeben. Jetzt möchte ich aber diese 3 Results zusammenfassen, so dass nur die Datensätze ausgegeben werden, die in allen 3 Ergebnissen enthalten sind. (Aus Platzgründen verzichte ich drauf, den ganzen Quellcode hier aufzulisten, denn das sind über 800 Zeilen)

Wie das mit deinem Vorschlag, JOIN zu verwenden, funktionieren soll, verstehe ich leider noch nicht ganz.

Aber ich habe inzwischen im Netz was gefunden, was auch zur Lösung meines Problems dienen könnte: array_merge. Was hälst du davon?

Wenn ich nur mal Arrays kapieren würde… :frowning: damit stehe ich irgendwie immer noch auf Kriegsfuß - nicht nur bei PHP. Gibt es irgendwo in den weiten des Internets eine wirklich idiotensichere Erklärung dafür?

Viele Grüße
Merlinchen

Wenn ich nur mal Arrays kapieren würde… :frowning: damit stehe ich
irgendwie immer noch auf Kriegsfuß - nicht nur bei PHP. Gibt
es irgendwo in den weiten des Internets eine wirklich
idiotensichere Erklärung dafür?

eine variable ist ein container fuer einen inhalt.
ein array ist eine variable mit mehreren fächern - wie dein rollcontainer.
die einzelnen faecher spricht man an mit: $rollcontainer[‚oberes fach‘], $rollcontainer[‚unteres fach‘] etc. die faehcer koenen durchgehend nummeriert sein $rollcontainer[0] … $rollcontainer[3] - oder benamt wie im ersten bspl.

1 Like

super!
Hallo dog.je,

danke, so versteh sogar ich das!

Aber ich habe noch ne Frage dazu: wo liegt der Unterschied zwischen ein- und mehrdimensionalen Arrays?

Viele Grüße
Merlinchen

Aber ich habe noch ne Frage dazu: wo liegt der Unterschied
zwischen ein- und mehrdimensionalen Arrays?

wenn du in das obere fach deines rollcontainers eine stiftablage reintust, hast du ein mehrdimensinales array…
die erste dimension sind die faecher des rollcontainers, die zweite dimesnsion die einzelfaecher der stiftablage.

$rollcontainer[‚oberstes fach‘][‚erste spalte der stiftablage‘] = „roter edding“;
$rollcontainer[‚oberstes fach‘][‚zweite spalte der stiftablage‘] = „schwarzer federhalter“;

man kann das auch ein array von arrays nennnen.

1 Like