2010-11-28 10 views
0

ich eine ziemlich lange SQL-Abfrage haben:MySQL - und Abfrage auf verknüpften Tabelle

SELECT *, content.contentID AS thisID 
FROM content 
LEFT JOIN link_keywords ON content.contentID = link_keywords.contentID 
LEFT JOIN link_countries ON content.contentID = link_countries.contentID 
LEFT JOIN link_sections ON content.contentID = link_sections.contentID 
WHERE status = '1' AND typeID = '1' 
GROUP BY contentID 
ORDER BY creationDate DESC 

ich wieder einen Satz von Ergebnissen, was ich tun möchte ist, alle Ergebnisse anzuzeigen, in dem sectionID (die von der kommt link_sections join) ist gleich 3 oder 4. Mit anderen Worten, alle Ergebnisse, die in Abschnitt 3 und 4 sind.

Die folgende Abfrage gibt nichts zurück, vermutlich weil sie nach einem einzelnen sucht Reihe mit sectionID gleich 3 und 4. Was ich brauche, ist jede content.contentID mit sectionID gleich 3 und 4.

SELECT *, content.contentID AS thisID 
FROM content 
LEFT JOIN link_keywords ON content.contentID = link_keywords.contentID 
LEFT JOIN link_countries ON content.contentID = link_countries.contentID 
LEFT JOIN link_sections ON content.contentID = link_sections.contentID 
WHERE status = '1' AND typeID = '1' AND (sectionID = '3' AND sectionID = '4') 
GROUP BY contentID 
ORDER BY creationDate DESC 
+1

* Was ich brauche, ist jede content.contentID mit sectionid gleich 3 und 4. * Das ist unmöglich. Meinst du * zwei * Zeilen, die die gleiche content.contentID haben und sectionID gleich 3 bzw. 4? –

+0

Hallo. Ja, stellen Sie sich also content.contentID gleich 1 vor (dies ist ein einzelner Artikeldatensatz). Dieser Artikel kann in vielen verschiedenen Abschnitten sein. Ich möchte also nur Artikelsätze, die sich in den Abschnitten 3 und 4 befinden. – Chris

+0

Können Sie Ihr Schema posten? –

Antwort

2

Sie könnten Unter SELECTs verwenden:

SELECT *, content.contentID AS thisID 
FROM content 
LEFT JOIN link_keywords ON content.contentID = link_keywords.contentID 
LEFT JOIN link_countries ON content.contentID = link_countries.contentID 
LEFT JOIN link_sections ON content.contentID = link_sections.contentID 
WHERE status = '1' AND typeID = '1' AND 
     content.contentID IN (SELECT section3.contentID 
          FROM link_sections AS section3 
          WHERE sectionID = 3) AND 
     content.contentID IN (SELECT section4.contentID 
          FROM link_sections AS section4 
          WHERE sectionID = 4) 
GROUP BY contentID 
ORDER BY creationDate DESC 
+0

+1 Das läuft schneller und ist eleganter als meins. –

+0

Großartig - Ich schätze die Hilfe sehr, die Sie mir gegeben haben. Vielen Dank. – Chris

1

Try this:

SELECT 
    *, 
    content.contentID AS thisID 
FROM content 
    LEFT JOIN link_keywords 
    ON content.contentID = link_keywords.contentID 
    LEFT JOIN link_countries 
    ON content.contentID = link_countries.contentID 
    LEFT JOIN link_sections 
    ON content.contentID = link_sections.contentID 
WHERE 
(SELECT COUNT(contentID) AS counter FROM link_sections s2 WHERE s2.contentID=content.contentID AND (sectionID='3' OR sectionID='4') GROUP BY contentID)=2 
    AND STATUS = '1' 
    AND typeID = '1' 
    AND (sectionID = '3' 
     OR sectionID = '4') 
GROUP BY content.contentID 
ORDER BY creationDate DESC; 
+0

Hi - ja, ich habe das versucht, aber das bringt die contentIDs zurück, die entweder in sectionID3 oder sectionID4 sind. Was ich will, sind Elemente in beiden Abschnitten. – Chris

+0

Bearbeitet und funktioniert jetzt für die Anforderungen, aber [Daniels Lösung] (http://stackoverflow.com/questions/4299007/mysql-and-query-on-joined-table/4299205#4299205) ist eine bessere, einfach verlassen hier zum Vergleich. –

0

Was Sie tun müssen, ist wählen Sie die Zeilen mit sectionid = '3' und schneiden Sie die Ergebnisse mit den Zeilen mit sectionid = '4'.

Verwandte Themen