[MySQL] Inner Join auf gleicher Tabelle

airliner

Erfahrenes Mitglied
Salve!
Nach längerer Abwesenheit muss ich heute erneut eine Frage stellen. Es geht dabei um einen INNER JOIN auf der gleichen Tabelle.
Der Hintergrund: Ich will eine Art Dokument wieder "zusammensetzen", welches in einzelnen Tupeln gespeichert wurde. Sprich, jeder Abschnitt eines Dokuments (Frage, Antwort, Anhänge, etc.) bildet je einen Datensatz. Verknüpfen könnte man die per itemid. Der Primarykey ist irgendeine andere fortlaufende Nummer, die ich nicht weiter benötige.

Daneben wird überprüft, ob das Dokument überhaupt freigegeben wurde, den richtigen Personenkreis und überhaupt zum geforderten Typ gehört. Diese drei Prüfungen sind weniger das Problem und funktionieren soweit.

SQL:
SELECT
  DOCUMENT.name,
  DOCUMENT.itemid,
  ITEM.modificationdate,
  DOCUMENTFIELD.name,
  DOCUMENTFIELD.cdata

FROM DB.DOCUMENT, DB.ITEM, DB.DOCUMENTFIELD

WHERE
  DOCUMENT.statusid = "1120"
  AND DOCUMENT.communityid = "2"
  AND DOCUMENT.templateid = "5"
  AND ITEM.id = DOCUMENT.itemid
  AND DOCUMENT.itemid = DOCUMENTFIELD.documentid

ORDER BY modificationdate DESC;

Wie bekomme ich jetzt den JOIN da rein? Die o.g. Abfrage wirft etwa folgendes aus:
Nameitemidmodificationdatenamecdata
Titel 11112012-07-02 10:00:00FrageInhalt der Frage
Titel 11112012-07-02 10:00:00AntwortInhalt der Antwort
Titel 11112012-07-02 10:00:00ScreenshotNULL
Titel 11112012-07-02 10:00:00etcNULL
Titel 22222012-07-01 10:00:00FrageInhalt der Frage

Ich habe dann mal hiermit experimentiert:
SQL:
SELECT DISTINCT DOCUMENTFIELD.name AS DF_Frage,
DOCUMENTFIELD.cdata AS DF_data_Frage,
DOCUMENTFIELD.documentid

FROM kmmaster3.DOCUMENTFIELD

JOIN kmmaster3.DOCUMENTFIELD DF ON DOCUMENTFIELD.documentid = DF.documentid

WHERE DOCUMENTFIELD.name = "FAQ-Frage"
OR  DOCUMENTFIELD.name = "Antwort";

Letztlich kam das gleiche Resultset wie ohne die JOIN-Zeile.
Was mache ich falsch? Habe ich irgendwo einen Denkfehler?
 
Zuletzt bearbeitet von einem Moderator:
Wie soll den das Resultat aussehen? Alle mit derseben documentid auf derselben Zeile und die FAQ-Frage als ein Feld und Antwort als anderes Feld?

Ich geh mal von MySQL aus.
Du kannst es als Cross-Query lösen
SQL:
SELECT
  DOCUMENT.name,
  DOCUMENT.itemid,
  ITEM.modificationdate,
  -- Wenn das name-Feld = FAQ-Frage, dann den Wert ansonsten NULL
  MAX(CASE DOCUMENTFIELD.name WHEN "FAQ-Frage" THEN DOCUMENTFIELD.cdata ELSE NULL END) AS faq_frage,
  -- Wenn das name-Feld = Antwort, dann den Wert ansonsten NULL
  MAX(CASE DOCUMENTFIELD.name WHEN "Antwort" THEN DOCUMENTFIELD.cdata ELSE NULL END) AS antwort
FROM 
  DB.DOCUMENT, 
  DB.ITEM, 
  DB.DOCUMENTFIELD
WHERE
  DOCUMENT.statusid = "1120"
  AND DOCUMENT.communityid = "2"
  AND DOCUMENT.templateid = "5"
  AND ITEM.id = DOCUMENT.itemid
  AND DOCUMENT.itemid = DOCUMENTFIELD.documentid
  AND DOCUMENTFIELD.name IN("FAQ-Frage", "Antwort")
GROUP BY
  DOCUMENT.name,
  DOCUMENT.itemid,
  ITEM.modificationdate
 
Zuletzt bearbeitet von einem Moderator:
Danke für die schnelle Antwort.
Ich würde deine Cross-Query (überhaupt nicht drauf gekommen, dass es das auch noch gibt) gern ausprobieren, bekomme jetzt aber den Fehler 1142 "SELECT command denied for user %user for table 'ITEM'.

Warum auch immer, eine Begrenzung des von mir verwendeten Users ist mir jedenfalls nicht bekannt.
 
Ich bin so doof. -.-'

Wenn in der FROM-Klausel ein Schreibfehler ist, kann natürlich nicht darauf zugegriffen werden. Ich frage mich zwar, warum der 1142-Fehler kommt und nicht "Table not found" oder dergleichen, aber ok.

Vielen Dank Yaslaw!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück