2009-08-23 10 views
1

Ich habe eine Indextable, die eine content_id halten und colomn eingeben. (z. B. content_id = 1, type = audio. Content_id = 1, type = video) Wäre es möglich, die richtigen Daten basierend auf content_id aus den richtigen Tabellen (Tabellen: ContentVideo, ContentAudio) zu bekommen?MySQL Mehrere auswählen

+0

können Sie genau klären, welche Tabellen Sie haben und welche Felder sie haben? –

+1

Ich habe das Tag "polymorphe Assoziationen" hinzugefügt, weil Sie das tun. Folgen Sie dem Tag, um weitere Fragen zu diesem Datenbankentwurf zu sehen. –

Antwort

0
+1

Ich habe in der MysSQL auf den Link gelesen, den Sie gaben. Das Konzept ist klar, die Beispiele sind dürftig, aber ich habe ein wenig gesucht und genau das gefunden, was ich benötigt habe, basierend auf Ihrer CASE-Geste. Vielen Dank! Für andere Leute, die auf die gleiche Sache stolpern könnten. Hier ist der Link, den ich brauchte (ein SELECT basierend auf einem CASE-Schalter) http://forums.mysql.com/read.php?10,245909,245990#msg-245990 –

+0

Nun, kein Problem! ;) –

1

Ich nehme an, Sie die Inhalte über eine einzige Select-Anweisung abrufen möchten? Wenn das Layout Ihrer Inhalte Tabellen ist genau das gleiche können Sie UNION verwenden:

SELECT ca.* FROM contentaudio ca, indextable it 
WHERE ca.content_id = it.content_id 
    AND it.content_type = 'audio' 
UNION 
SELECT cv.* FROM contentvideo cv, indextable it 
WHERE cv.content_id = it.content_id 
    AND it.content_type = 'video' 
ORDER BY content_id /* or whatever */ 

Beachten Sie, dass, wenn content_id über alle Ihre content Tabellen nicht eindeutig ist, können Sie mehrere Datensätze erhalten (unterschiedlicher Typen) für den gleichen content_id. Beachten Sie außerdem Folgendes: Wenn Sie einen bestimmten Datensatz auf Basis eines Schlüssels von indextable auswählen, müssen Sie ihn jedem Teil der Union hinzufügen.

Wenn Ihr content Tabellen verschiedenen Layouts haben, können Sie eine OUTER JOIN stattdessen verwenden und Ihre verschiedenen Inhaltstypen als Teil eines Datensatzes abzurufen (Fehlenden wird als NULL-Werte zurückgegeben werden):

SELECT * FROM indextable it 
    LEFT OUTER JOIN contentaudio ca ON it.content_id = ca.content_id 
    LEFT OUTER JOIN contentvideo cv ON it.content_id = cv.content_id 
WHERE it.some_key = ? 

Beachten Sie, dass content_type ist in diesem Fall überhaupt nicht beteiligt (und Sie brauchen es auch nicht für UNION).