select-problem mit 3 Tab

select-problem mit 3 Tab

am 01.11.2006 02:46:50 von Charlotte Schweitzer

Hallo,
kann mir mal jemand helfen?

Ich habe drei Tabellen, die so aussehen:

tab0 mit tab0_ID sowie tab1_ID (Haupttab.)
tab1 mit tab1_ID
tab2 mit tab0_ID

wichtig ist, das ich *alle* Datensätze
von tab0 sehe.
Bisher haben aber immer ein paar gefehlt - oder
aber MySQl (3.23 oder so) ist hängen geblieben.

Beste bzw. stabilste Ergebnis habe ich momentan
mit ...
FROM tab0 RIGHT JOIN tab2 ON tab0.tab0_ID = tab2.tab0_ID, tab1
.... erhalten.
aber eben nicht vollständig (da tab1 und tab2 weniger Datensätze
haben).

Abgefragt per string werden sie einzeln oder alle drei zusammen.

Vielen Dank und
Grüße, Charlotte

Re: select-problem mit 3 Tab

am 01.11.2006 07:15:05 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: select-problem mit 3 Tab

am 01.11.2006 09:56:46 von Claus Reibenstein

Charlotte Schweitzer schrieb:

> tab0 mit tab0_ID sowie tab1_ID (Haupttab.)
> tab1 mit tab1_ID
> tab2 mit tab0_ID
>
> wichtig ist, das ich *alle* Datensätze
> von tab0 sehe.
> [...]
> FROM tab0 RIGHT JOIN tab2 ON tab0.tab0_ID = tab2.tab0_ID, tab1

FROM tab0 LEFT JOIN tab2 using (tab0_ID)
LEFT JOIN tab1 using (tab1_ID)


Gruß. Claus

Re: select-problem mit 3 Tab

am 01.11.2006 12:13:13 von Charlotte Schweitzer

Hallo Claus,
>> ...
>> tab0 mit tab0_ID sowie tab1_ID (Haupttab.)
>> tab1 mit tab1_ID
>> tab2 mit tab0_ID
>> ...
> FROM tab0 LEFT JOIN tab2 using (tab0_ID)
> LEFT JOIN tab1 using (tab1_ID)
Danke! Das sieht schick aus.

Der Aufwand, Spalten umzubenennen - sie müßten
bei USING ja gleich heißen - würde sich sicher lohnen
(hängt bischen was dran ...)? (Verknüpfungsspalten
der Basistabellen hatte ich mal anders als die in anderen
Tabs benannt :-())

Ich habe relevante Spalten angeglichen aber Meldungen wie:
Unbekanntes Tabellenfeld 'tab2.tab1_ID' in on clause.
erhalten. Das Feld existiert garnicht! Wie kann das
sein?
Die Feldliste ist auch per Tabellennamen klar definiert ...

FROM tab0 LEFT JOIN tab2 ON tab2.tab0_ID = tab0.tab0_ID
LEFT JOIN tab1 ON tab1.tab1_ID = tab0.tab1_ID
WHERE tab1.strg1 LIKE '$qger%' AND
....
so dauerts wieder zu lange.

Grüße, Charlotte

PS: altes MySql wegen altem Rechner und
bisher ausreichender performance/features ...
why change ...

Re: select-problem mit 3 Tab

am 01.11.2006 14:04:26 von Claus Reibenstein

Charlotte Schweitzer schrieb:

> Hallo Claus,

Du darfst ruhig allen antworten :-)

>> FROM tab0 LEFT JOIN tab2 using (tab0_ID)
>> LEFT JOIN tab1 using (tab1_ID)
>
> Danke! Das sieht schick aus.

Funktioniert aber offenbar nicht ...

> Der Aufwand, Spalten umzubenennen - sie müßten
> bei USING ja gleich heißen - würde sich sicher lohnen
> (hängt bischen was dran ...)? (Verknüpfungsspalten
> der Basistabellen hatte ich mal anders als die in anderen
> Tabs benannt :-())

Zumindest spart es Schreibarbeit. Ob es auch an der Performance etwas
ändert, weiß ich nicht. Vermutlich nicht.

> Ich habe relevante Spalten angeglichen aber Meldungen wie:
> Unbekanntes Tabellenfeld 'tab2.tab1_ID' in on clause.
> erhalten. Das Feld existiert garnicht! Wie kann das
> sein?

Offenbar hat er den zweiten LEFT JOIN auf tab2 statt auf tab0 bezogen.
Vermutlich ein Fehler in meiner Syntax (bin noch nicht 100% JOIN-fest).

> FROM tab0 LEFT JOIN tab2 ON tab2.tab0_ID = tab0.tab0_ID
> LEFT JOIN tab1 ON tab1.tab1_ID = tab0.tab1_ID

Das sollte allerdings funktionieren.

> WHERE tab1.strg1 LIKE '$qger%' AND
> ....
> so dauerts wieder zu lange.

Das liegt vermutlich an dem LIKE, weil er hier nicht auf den Index
zugreifen kann, sondern die Tabelle komplett lesen muss.

> PS: altes MySql wegen altem Rechner und

Wie alt?

Gruß. Claus

Re: select-problem mit 3 Tab

am 01.11.2006 15:36:05 von Charlotte Schweitzer

Hallo ng,
> ...
>>WHERE tab1.strg1 LIKE '$qger%' AND
>>....
>>so dauerts wieder zu lange.
auch wenn ich das WHERE rausnehme, dauerts:
Nach MySqlAdmin , in der Prozessliste, scheint
"er" sich hauptsächlich mit dem Kopieren in
einen tmp-table zu beschäftigen.
>
>
> Das liegt vermutlich an dem LIKE, weil er hier nicht auf den Index
> zugreifen kann, sondern die Tabelle komplett lesen muss.
mmh - kompliziert wirds da.
Vielleicht sollte ich dann die query stückeln ...
>
>
>>PS: altes MySql wegen altem Rechner und
>
>
> Wie alt?
PII 266

Grüße, Charlotte

Re: select-problem mit 3 Tab

am 01.11.2006 16:24:42 von Claus Reibenstein

Charlotte Schweitzer schrieb:

> auch wenn ich das WHERE rausnehme, dauerts:
> Nach MySqlAdmin , in der Prozessliste, scheint
> "er" sich hauptsächlich mit dem Kopieren in
> einen tmp-table zu beschäftigen.

Vielleicht liegt's ja an der alten MySQL-Version :-)

>>> PS: altes MySql wegen altem Rechner und
>>
>> Wie alt?
>
> PII 266

Gut, das erklärt natürlich einiges. Bei der Maschine kann man nicht viel
Performance erwarten.

Aber eigentlich meinte ich das Alter von MySQL :-)

Gruß. Claus

Re: select-problem mit 3 Tab

am 01.11.2006 18:30:21 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)

Re: select-problem mit 3 Tab

am 01.11.2006 21:04:08 von Charlotte Schweitzer

Hallo
x=29.
Ich habs jetzt mit zwei php-kontrollierten
SELECTs: einem mit einem LEFT JOIN und einem ohne.
Keine Schönheit, auf ein paar Infos muß man bei
Abfrage jew. verzichten, aber es ist schnell, es
funktioniert - soweit.
Danke nochmal, Grüße, Charlotte

Re: select-problem mit 3 Tab

am 04.11.2006 00:28:26 von Thomas Rachel

Charlotte Schweitzer wrote:

> auch wenn ich das WHERE rausnehme, dauerts:
> Nach MySqlAdmin , in der Prozessliste, scheint
> "er" sich hauptsächlich mit dem Kopieren in
> einen tmp-table zu beschäftigen.

Was meint EXPLAIN in den jeweiligen Fällen? Vielleicht fehlt Dir nur
irgendwo ein passender Index...


Thomas
--
Eine Schraube ohne Nagel ist ein Gewinde.