Aus 2 mach 1? Subquery gesucht
Stefan
- datenbank
0 Encoder0 Matti Mäkitalo0 Stefan
Hi,
kann ich aus diesen beiden Queries auch 1 machen?
$query=("
select
t1.ID,
t2.Nummer
FROM tabelle1 t1
JOIN
tabelle2 t2 ON t1.ID = t2.ID
WHERE
t1.Spalte1 != 1");
$result=mysql_query($query);
if ($result==FALSE) {
error();
}
while ($row=mysql_fetch_row($result)) {
$query_u="SELECT
Spalte3,
Spalte4
FROM Tabelle3
WHERE
Spalte5 = $row[0] AND Spalte6 = $row[1]
";
...
}
Grüß euch, Stefan
Einfach Tabelle3 auch noch mit rein joinen? Oder wo genau siehst du das Problem?
Einfach Tabelle3 auch noch mit rein joinen? Oder wo genau siehst du das Problem?
Na das wär ja kein Problem.
Aber ich würde lieber eine Subquery haben, weil der JOIN zu arbeitsintensiv ist.
Grüße, Stefan
Bist du da ganz sicher? Subqueries sind doch im Prinzip das selbe.
Und wie du an einer anderen Stelle schreibst, hast du ja sowieso eine 1:1 Beziehung. Dann lässt du das doch lieber auf einmal joinen, statt für jedes Ergebnis aus dem ersten Teil eine neue Query für den zweiten Teil zu starten.
Hi,
kann ich aus diesen beiden Queries auch 1 machen?
[...]
Das kommt drauf an, in welcher Beziehung die beiden Tabellen zueinander stehen.
Wenn einem Tupel (t1.ID, t2.Nummer) genau ein Eintrag in Tabelle3 gegenübersteht, kannst du es "einfach" als Subquery schreiben.
Hast du dagegen z.B. eine 1:n Beziehung, dann würdest du pro Ergebniszeile des ersten Queries ja eine Menge an Ergebnis-Zeilen des zweiten Queries. Da müsstest du diese, wenn du es in einem Query haben willst, diese mit einer Aggregatfunktion, z.B. GROUP_CONCAT, bearbeiten.
Bis die Tage,
Matti
Hi,
Hast du dagegen z.B. eine 1:n Beziehung, dann würdest du pro Ergebniszeile des ersten Queries ja eine Menge an Ergebnis-Zeilen des zweiten Queries. Da müsstest du diese, wenn du es in einem Query haben willst, diese mit einer Aggregatfunktion, z.B. GROUP_CONCAT, bearbeiten.
Es sollte eigentlich eine 1:1 Beziehung sein...
Wie würde dann das Subselect aussehen?
Und was wäre, wenn versehentlich eine 1:n Beiehung aufträte?
Grüß Dich, Stefan
Hi,
Wie würde dann das Subselect aussehen?
Eigentlich keine Raketenphysik, dass könntest du anhand der Dokumentation deines DBMS eigentlich herausfinden. Aber ich will mal nicht so sein:
SELECT
t1.ID,
t2.Nummer,
(
SELECT Spalte3
FROM Tabelle3
WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer
) AS Spalte3,
(
SELECT Spalte4
FROM Tabelle3
WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer
) AS Spalte4
FROM tabelle1 t1
JOIN tabelle2 t2 ON t1.ID = t2.ID
WHERE t1.Spalte1 != 1
Und was wäre, wenn versehentlich eine 1:n Beiehung aufträte?
Es kommt drauf an. Obiges Statement würde eine Fehlermeldung liefern, welche etwa so lauten würde: "Subquery returns more than one row".
Die Lösung wäre, dafür zu sorgen, dass nur ein Result in den Subqueries zurückkommt. Entweder also die Subqueries einschränken mit ORDER BY/LIMIT
, oder eine Aggregatfunktion verwenden (z.B. MAX/MIN/..., wenn du ein bestimmtes haben willst, oder z.B. GROUP_CONCAT
, wenn du alle (mit einem optionalen Separierer) haben willst).
Bis die Tage,
Matti
Hi Matti,
Eigentlich keine Raketenphysik, dass könntest du anhand der Dokumentation deines DBMS eigentlich herausfinden. Aber ich will mal nicht so sein
Sehr vielen Dank.
Denn ich hatte bereits versucht, es selber herauszufinden und nicht geschafft.
Und auch zu Deiner Lösung habe ich eine Frage.
SELECT
t1.ID,
t2.Nummer,
(
SELECT Spalte3
FROM Tabelle3
WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer
) AS Spalte3,
(
SELECT Spalte4
FROM Tabelle3
WHERE Tabelle3.Spalte5 = t1.ID AND Tabelle3.Spalte6 = t2.Nummer
) AS Spalte4
FROM tabelle1 t1
JOIN tabelle2 t2 ON t1.ID = t2.ID
WHERE t1.Spalte1 != 1
>
Muß man wirklich 2 subselects machen, wenn man Spalte 3+4 einbeziehen will?
Danke und Grüße, Stefan
Hi,
Muß man wirklich 2 subselects machen, wenn man Spalte 3+4 einbeziehen will?
Ich kenne keine saubere andere Lösung.
Eine Alternative wäre, Spalte 3 und 4 DB-seitig zusammenzuklatschen (z.B. mit CONCAT_WS('#', Spalte3, Spalte4)
, wobei du als Separator (hier '#') ein Zeichen brauchst, was nicht in den Daten vorkommt) und dann anwendungsseitig diese Ergebnisspalte wieder auseinandernimmst anhand des gewählten Trenners.
Bis die Tage,
Matti