2010-11-28 10 views
0

J'ai une assez longue requête SQL:MySQL - ET requête sur la table jointe

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 

je reviens un ensemble de résultats, ce que je voudrais faire est afficher tous les résultats où sectionID (qui vient de la link_sections join) est égal à 3 ou 4. En d'autres termes, tous les résultats qui se trouvent à la fois dans la section 3 et 4.

La requête suivante ne retourne rien, probablement parce qu'elle vérifie un seul ligne avec sectionID égal à 3 et 4. Ce dont j'ai besoin est content.contentID avec sectionID égal à 3 et 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

* Ce que je dois tout est content.contentID avec sectionID égal à 3 et 4. * C'est impossible. Voulez-vous dire * deux * lignes qui ont le même content.contentID et ont des sectionsID égales à 3 et 4 respectivement? –

+0

Bonjour. Oui, alors imaginez content.contentID est égal à 1 (c'est un enregistrement d'article unique). Cet article peut être dans plusieurs sections différentes. Donc, je ne veux que les enregistrements d'articles qui sont dans les sections 3 et 4. – Chris

+0

Pouvez-vous poster votre schéma? –

Répondre

2

Vous pouvez utiliser des sous-Selects:

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 Cela fonctionne plus vite et est plus élégant que le mien. –

+0

Super - J'apprécie vraiment l'aide que vous m'avez donnée. Je vous remercie. – Chris

1

Essayez ceci:

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

Salut - oui, j'ai essayé cela mais cela ramène contentID qui sont dans sectionID 3 ou sectionID 4. Ce que je veux, ce sont des éléments sur les deux sections. – Chris

+0

Édité et travaille maintenant pour les exigences, mais [la solution de Daniel] (http://stackoverflow.com/questions/4299007/mysql-and-query-on-joined-table/4299205#4299205) est un meilleur, juste laisser ici pour comparaison. –

0

Ce que vous devez faire est de sélectionner les lignes avec sectionID = '3' et se croisent les résultats avec les lignes avec sectionID = '4'.

Questions connexes