2009-06-02 7 views
1

Voici comment les choses fonctionnent
J'utilise les tableaux de catégories Wordpress et j'ai 2 catégories principales. Le premier s'appelle "location" et l'autre "subject". Les deux catégories ont leurs propres sous-catégories.Wordpress avancé SQL - jointures et comptes

Dans mon exemple, nous avons « location » catégorie 17 et « subject » catégorie 3.

ce que je veux faire
Je veux sélectionner uniquement les données où mes deux catégories 17 ET 3 sont présentés.

Ce code fonctionne jusqu'à présent

SELECT term_id, post_title, post_name, ID, object_id, post_status 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 

Le problème
Les deux catégories 17 et 3 existe dans la même colonne. Le code ci-dessus liste les ID deux fois si les posts apparaissent dans les deux catégories.

Y at-il un moyen de compter les ID qui sont égaux dans le résultat? Si ID existe deux fois, sélectionnez le message de cet ID.

Répondre

1

Cela permet de sélectionner chaque poste une seule fois, si elle existe dans les deux catégories:

SELECT post_title, post_name, post_status 
FROM wp_posts AS wpost 
WHERE post_status = 'publish' 
     AND EXISTS (
     SELECT 1 
     FROM  wp_term_relationships 
     INNER JOIN 
       wp_term_taxonomy 
     ON  wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id 
       AND wp_term_taxonomy.taxonomy = 'category' 
       AND wp_term_taxonomy.term_id IN (17, 3) 
     WHERE wp_term_relationships.object_id = wpost.ID 
     LIMIT 1, 1 
     ) 
+0

Il ne fonctionne pas. Si je supprime la ligne avec INNER JOIN au moins ne me donne pas d'erreurs, mais il me montre des rangées dans 17 ou 3. J'ai besoin dans les deux 17 et 3. –

+0

Il fonctionne comme un charme maintenant après avoir édité le poste . Merci, sauvé ma journée! –

0

Cela ferait (à condition qu'il n'y a pas de lignes en double pour une entrée étant dans la catégorie 3 ou 17) sans qu'il soit nécessaire pour une requête imbriquée:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(*) as count 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 
    AND count = 2 

GROUP BY ID 

Ajout du count variable and the GROUP BY clause va agglutiner les doublons ensemble. Vous filtrez ensuite les lignes où count est égal à 2 pour obtenir les entrées dans les deux catégories.

+0

L'idée est géniale, mais ne fonctionne pas. Cela me donne un résultat vide. –

+0

Même commentaire que ce que j'ai posté au message suivant: "AND count = 2" ne fonctionne pas car le compte n'existe pas jusqu'à ce que les lignes soient renvoyées. Je recommande également de mettre count dans '' parce que c'est un mot réservé. Ce dont vous avez besoin est "HAVING' count' = 2 "ou" HAVING count (*) = 2 ". –

0

Un pas de plus? Maintenant, la seule chose que je dois faire est de montrer les lignes qui contiennent "2" dans la colonne "count". Parce que la colonne count est créée dans la "boucle", cela n'a pas fonctionné pour écrire simplement "ET count = 2".

Cet exemple affiche le résultat, y compris la colonne de comptage:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(ID) as count 
FROM wp_posts AS wpost 
INNER JOIN wp_term_relationships 
    ON wpost.ID = wp_term_relationships.object_id 

INNER JOIN wp_term_taxonomy 
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category' 

WHERE wp_term_taxonomy.term_id IN (17, 3) 
    AND post_status = 'publish' 

GROUP BY ID 
+0

"AND count = 2" ne fonctionne pas car le compte n'existe pas jusqu'à ce que les lignes soient renvoyées. Je recommande également de mettre count dans '' parce que c'est un mot réservé. Ce dont vous avez besoin est "HAVING' count' = 2 "ou" HAVING count (*) = 2 ". –

+0

@Jens: vous pouvez simplement ajouter HAVING COUNT (*) = 2 dans votre requête, mais il est préférable d'utiliser EXISTS avec LIMIT 1, 1. GROUP BY est pire pour les performances. – Quassnoi