Une requête qui n'est pas tout à fait correcte

Une requête qui n'est pas tout à fait correcte - SQL/NoSQL - Programmation

Marsh Posté le 27-02-2009 à 15:06:03    

Bonjour,
 
J'espère pouvoir trouver une solution à ce problème qui m'empoisonne pas mal l'existence ces jours derniers. Je suis pas vraiment ce qu'on peut appeler un codeur, même si j'ai un DUT SRC, ca fait bien longtemps que j'ai arrété de faire du dev web pur et dur. Je me débrouille avec ce que je sais faire, mais parfois il m'arrive (comme là), de n'avoir aucune idée sur ce que je devrais faire pour obtenir ce que je veux. En vrai, j'ai pas du créer une requête SQL depuis facilement 4 ans.
 
Donc voilà, sous wordpress, on a une fonction qui s'appelle previous_post_link (pareil avec next), qui en théorie permet d'exclure un certain nombre de catégories, qui fait que la navigation ne s'opère qu'au sein d'une seule catégorie, ce qui est par ailleurs exactement ce dont j'ai besoin.
 
Or voilà, il semblerait que ca ne marche pas. Disons que si j'ai deux catégories, chien et chat, et que je veux naviguer uniquement dans chat, ben le filtre "vire-moi-les-chiens" ne fonctionne pas. Car le post suivant ou précédent apparait quand meme comme être un chien. Enfoiré!
 
 
J'ai cherché sur les forums wordpress, aucune réponse consistante n'a pu venir me sauver, donc j'ai décidé d'y aller à bras-le-corps, et d'aller moi-même farfouiller dans les requêtes sql.
 
Donc voici la requête effectuée par wp pour savoir quel est le post suivant à afficher (pour en créer un lien, enfin je laisse wordpress faire son travail, le problème étant surtout qu'il me retourne des posts de mauvaise catégorie):
 

Code :
  1. SELECT p.* FROM `wpmod_posts` AS p INNER JOIN wpmod_term_relationships AS tr ON p.ID = tr.object_id INNER JOIN
  2. wpmod_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE p.post_date < '2009-02-24 15:44:17'
  3. AND p.post_type = 'post' AND p.post_status = 'publish' AND tt.taxonomy = 'category' AND tt.term_id NOT IN (5) ORDER
  4. BY p.post_date DESC LIMIT 1


où NOT IN (5) est censé opérer le filtre.
 
Maintenant je l'ai retournée dans tous les sens, en remplacant par !=, en mettant IN, ou = en changeant la catégorie (5 ou 6), en l'enlevant, et à chaque fois il me retourne le même post.  
 
Donc, mes capacités d'analyse m'ont permis d'en conclure que cette condition ne sert absolument à rien dans la requête. Maintenant j'aimerais savoir s'il y a un moyen d'arriver à faire marcher ce filtre, dont j'ai désespérément besoin, pour lequel j'ai essayé plusieurs méthodes et sur lequel je viens de passer plusieurs heures (au moins depuis hier apm), et si oui, est ce que vous pourriez m'aider à l'atteindre?
 
Merci beaucoup
 
pour la structure de la db, on une dizaine de table, mais les trois utilisées ici sont correctes il me semble:
 
Post, contient tous les posts, relationship est la relation entre les post et les catégories:
 
http://www.kabouing.com/fresh_pas_acces_free/term_relationship.GIF
 
 
 
et term_taxonomy ressemble à cela:
 
http://www.kabouing.com/fresh_pas_acces_free/termm_taxonomy.GIF
 
Merci pour votre aide!

Reply

Marsh Posté le 27-02-2009 à 15:06:03   

Reply

Marsh Posté le 27-02-2009 à 16:45:31    

De ce que je comprends, ton post "3" est attaché aux catégories 3 et 6 en même temps, c'est bien ça ?
 
Si oui, déjà, est-ce normal ?
 
Ensuite, pour que la requête ne retourne des post que pour la categorie 3 par exemple, voici ce que je tenterais :
 

Code :
  1. SELECT p.* FROM wpmod_posts p
  2. INNER JOIN wpmod_term_relationships tr ON p.ID = tr.object_id
  3. INNER JOIN wpmod_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
  4. WHERE p.post_date < '2009-02-24 15:44:17'
  5. AND p.post_type = 'post'
  6. AND p.post_status = 'publish'
  7. AND tt.taxonomy = 'category'
  8. AND tt.term_id NOT IN (SELECT tt2.term_id FROM wpmod_term_taxonomy tt2
  9. INNER JOIN wpmod_term_relationships tr2 ON tr2.term_taxonomy_id = tt2.term_taxonomy_id AND tr2.obect_id = tr.object_id
  10. WHERE tt2.taxonomy = tt.taxonomy AND tt2.term_id != 3)
  11. ORDER BY p.post_date DESC LIMIT 1

Reply

Marsh Posté le 27-02-2009 à 16:46:19    

(à la base, il s'agit de sélectionner les lignes pour lesquelles on ne trouve pas de relation de catégorie différente de cette dans laquelle on est, si c'est bien ça que tu veux)

Reply

Marsh Posté le 02-03-2009 à 11:01:48    

en fait la catégorie 3 est la catégorie parent des catégories 5 et 6.

 

Ce que j'aimerais, c'est que quand on clique sur un élément de la catégorie 5, ou 6, on ait la possibilité de naviguer entre les différents de la même catégorie (5 ou 6) uniquement.

 

Je vais tester ton code.


Message édité par macelfresh le 02-03-2009 à 11:03:12
Reply

Marsh Posté le 02-03-2009 à 12:21:00    

on m'a proposé cette solution sur un autre forum qui a l'air de bien fonctionner.
 
C'est surtout une histoire de inner join et de where mal placé a priori
 

Code :
  1. SELECT p.* FROM `wpmod_posts` AS p INNER JOIN wpmod_term_relationships AS tr ON p.ID = tr.object_id INNER JOIN
  2. wpmod_term_taxonomy AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.term_id NOT IN (5)) WHERE p.post_date < '2009-02-24 15:44:17'
  3. AND p.post_type = 'post' AND p.post_status = 'publish' AND tt.taxonomy = 'category' ORDER
  4. BY p.post_date DESC LIMIT 1;


 
Maintenant il faut que j'arrive à mettre en place le code qui génére cette requête :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed