PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [MySQL] Zeilen einer Tabelle verknüpfen


Blade II
2011-06-08, 14:48:02
Moin,

ich habe folgende MySQL Tabelle gegeben:
idcontent|Primärschlüssel, ansonsten unwichtig
idartlang| verknüpft die einzelnen Datensätze
idtype | bestimmt content-typ: Überschriften -> "1", Text -> "2"
typeid | ?
value | Inhalt des Datensatzes

Jeder Artikel belegt mindestens zwei Einträge in der Tabelle.
Einen für die Überschrift (idtype = 1) und einen für den Text (idtype = 2)

Mein kläglicher Versuch die Datensätze zu verknüpfen resultiert in einem SQL-Error:
SELECT title.value, content.value FROM con_content AS title WHERE idtype = 1 LEFT JOIN con_content AS content ON title.idartlang = content.idartlang WHERE idtype = 2
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LEFT JOIN con_content AS content ON title.idartlang = content.idartlang WHERE id' at line 1

Habt ihr eine Idee für einen richtigen SQL-Query?

Viele Grüße,
Blade II

Frucht-Tiger
2011-06-08, 15:04:18
Schreib mal die WHERE Bedingungen hinter den JOIN, mit nur einem WHERE und verknüpft durch ein AND.

Wenn du mit der Syntax nicht klarkommst kannst du den self join sicherlich auch mit der normalen Syntax schreiben, also:

select a.xyz, b.xyz
from tab a, tab b
where a.link = b.link
and a.id = 42;

registrierter Gast
2011-06-08, 15:14:32
Die Syntax ist falsch, wie Frucht-Tiger bereits richtig bemerkte. Pro SELECT darf es nur ein WHERE geben.

Da du zwei Abfragen benötigst - eine für den Titel und eine für den Inhalt - kommst du nicht umhin, ein Subselect zu nutzen.
In etwa so:
SELECT con_content.idartlang, con_content.value FROM con_content
LEFT JOIN (SELECT idartlang, value FROM con_content WHERE idtype = 2) AS tmp ON tmp.idartlang = con_content.idartlang
WHERE idtype = 1

In dem ersten SELECT suchst du nach den Titeln, bewahrst dir aber gleichzeitig die gemeinsame ID der Datensätze (ich gehe mal davon aus, dies ist "idartlang"). Im eingebetteten SELECT beim LEFT JOIN machst du die gleiche Abfrage - nur halt nach idtype = 2. Da du auch hier "idartlang" abrufst, kannst du die Daten mittels eines LEFT JOINs verbinden.

AlecWhite
2011-06-08, 15:53:26
SELECT con_content.idartlang, con_content.value
FROM con_content
INNER JOIN con_content AS tmp ON tmp.idartlang = con_content.idartlang
WHERE con_content.idtype = 1 and tmp.idtype=2

Ist die besser Lösung, da hierdurch das Subquery verhindert wird. Da Subquery mit Indexe nicht so viel anfangen können (und die bei Join durchaus vom Vorteil sind) aus meiner Sicht die bessere Wahl (und ich nehme an, auf idtype ist ein Index, wenn nicht, setzen :))

registrierter Gast
2011-06-08, 16:14:41
Ist die besser Lösung, da hierdurch das Subquery verhindert wird. Da Subquery mit Indexe nicht so viel anfangen können (und die bei Join durchaus vom Vorteil sind) aus meiner Sicht die bessere Wahl (und ich nehme an, auf idtype ist ein Index, wenn nicht, setzen :))
Aight'. Das ist ganz klar die bessere Lösung. :)

Blade II
2011-06-08, 16:50:44
Ist die besser Lösung, da hierdurch das Subquery verhindert wird. Da Subquery mit Indexe nicht so viel anfangen können (und die bei Join durchaus vom Vorteil sind) aus meiner Sicht die bessere Wahl (und ich nehme an, auf idtype ist ein Index, wenn nicht, setzen :))

Grandios, deine und die Lösung von registrierter Gast funktionieren super.
Vielen vielen herzlichen Dank, ihr habt mir eine Menge Frust erspart =)

PS: Index auf idtype war bereits gesetzt

AlecWhite
2011-06-08, 19:31:17
Kein Thema. :)

Gast
2011-06-08, 21:23:26
Schreib mal die WHERE Bedingungen hinter den JOIN, mit nur einem WHERE und verknüpft durch ein AND.

Wenn du mit der Syntax nicht klarkommst kannst du den self join sicherlich auch mit der normalen Syntax schreiben, also:

select a.xyz, b.xyz
from tab a, tab b
where a.link = b.link
and a.id = 42;

Falls man den Join über Where angibt sollte diese Bedingung immer am Schluss stehen, damit nur eine eingeschränkte Menge von Zeilen verknüpft wird. (Eingeschränkt durch eben andere Bedingungen)
Ob es noch eine DB gibt, die das nicht selbstständig sortiert, weiß ich nicht, aber da sollte man sich vll nicht unbedingt auf die DB verlassen.