Extraire des résultats en comparant des colonnes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Extraire des résultats en comparant des colonnes

Re: Extraire des résultats en comparant des colonnes

par Ehplod » 06 août 2011, 11:25

Bon, réponse tardive, mais problème réglé.

J'ai donc créé une seconde table keyword avec les tag des articles, tout en gardant ces tag dans la table des articles.

Me requête demande donc les articles qui ont le meilleur total de tag issue de la table keyword correspondant aux tag de l'article sélectionné dans la table article.

Merci pour vos directions.

Re: Extraire des résultats en comparant des colonnes

par macgawel » 02 mai 2011, 16:32

Ou alors, je garde les keyword aussi dans ma table d'origine et je les récupère via une jointure... Ca oblige à garder les keywords dans 2 tables, mais ça allège considérablement la requête.
...Mais ça va allourdir considérablement d'autres opérations. Exemples vite fait :
- Modification / ajout de keyword (en particulier, comment gérer la distinction entre une modif et un ajout de keyword, qui se traduisent tous deux par un UPDATE dans ta première table).
- Passage à 5 (puis 6, puis ...) keywords

Après, c'est difficile de répondre sans connaître les aspects fonctionnels.
Tu es certain de conserver un maximum de 4 keywords ? Il pourront être mis à jour (à quelle fréquence) ? Cette requête passera régulièrement ? Il y aura beaucoup de modifications ? etc.

Là comme ça, je dirais que le plus simple c'est d'utiliser la table supplémentaire (on l'appellera Keywords) :
SELECT id, keyword FROM Keywords WHERE keyword in (...)
Ensuite, tu boucles et tu fais la somme en PHP.
Eventuellement, SI tu travailles sur une grosse table relativement statique, tu peux stocker le résultat (par exemple avec serialize())
Comme ça tu conserves une Base de donnée correcte (voir le post sur la normalisation), une requête simple, et le code PHP pour la présentation reste simple (c'est juste une boucle sur le résultat de ta requêteet une comparaison entre l'ID courant et l'ID précédent - il doit même être possible de stocker l'ensemble des résultats dans un tableau et de le travailler)

Re: Extraire des résultats en comparant des colonnes

par Genova » 02 mai 2011, 15:44

Oui, il est parfois plus intéressant de stocker les données en double (en cache en quelque sorte) pour simplifier les requêtes de lecture.

Re: Extraire des résultats en comparant des colonnes

par Ehplod » 02 mai 2011, 15:23

Ok, merci.

Bon, faut que je vois, parce que j'utilise déjà des select et des jointure imbriqués, là, ça va en faire pas mal.

Ou alors, je garde les keyword aussi dans ma table d'origine et je les récupère via une jointure... Ca oblige à garder les keywords dans 2 tables, mais ça allège considérablement la requête.

Re: Extraire des résultats en comparant des colonnes

par Genova » 02 mai 2011, 14:49

Je viens de tester avec cette requête :
SELECT a.id, a.keyword, (SELECT COUNT( b.id )
   FROM keywords b
   WHERE b.keyword IN ('pomme', 'peche', 'poire', 'abricot')
      AND a.id = b.id) as total
FROM keywords a
WHERE a.keyword IN ('pomme', 'peche', 'poire', 'abricot')
ORDER BY total DESC, a.id
Et à priori c'est bon ça sort les résultats suivants :

Code : Tout sélectionner

id keyword total 1 pomme 4 1 peche 4 1 poire 4 1 abricot 4 2 abricot 4 2 poire 4 2 peche 4 2 pomme 4 4 peche 2 4 poire 2 6 abricot 2 6 peche 2 3 pomme 1
Après il suffit de regrouper les mots clefs dans la boucle PHP qui parcourra les résultats.

Re: Extraire des résultats en comparant des colonnes

par Ehplod » 02 mai 2011, 08:07

Salut,

En effet, j'avais pas pensé à tout transférer dans une table spécifique pour faire mon tri. Ca marche impec.
Merci

Autre question.
Comment faire pour que ta requête me donne les keyword trouvés dans chaque groupe ?

Code : Tout sélectionner

id total Keywords 1 4 abricot, peche, poire, pomme 2 4 abricot, peche, poire, pomme 4 2 peche, poire 6 2 abricot, peche 3 1 pomme

Re: Extraire des résultats en comparant des colonnes

par Genova » 02 mai 2011, 04:42

Le cas idéal je pense, aurait été d'avoir une table supplémentaire comme ceci :

Code : Tout sélectionner

keywords : id | keyword
sachant que tu aurais une clef primaire sur les deux champs. Pour prendre un exemple concret tu aurais dans ta table ça :

Code : Tout sélectionner

id keyword 1 abricot 1 peche 1 poire 1 pomme 2 abricot 2 ananas 2 peche 2 poire 2 pomme 3 pomme 4 peche 4 poire 5 ananas 6 abricot 6 peche
Ensuite tu ferais une requête SQL du genre (en admettant que tu cherches les mots clefs pomme, peche, poire et abricot) :
SELECT id, COUNT( id ) AS total
FROM keywords
WHERE keyword IN ('pomme', 'peche', 'poire', 'abricot')
GROUP BY id
ORDER BY total DESC
Ce qui te sortirait comme résultat ce qu'il te faut :

Code : Tout sélectionner

id total 1 4 2 4 4 2 6 2 3 1
Et donc le tout sans aucune usine à gaz en PHP ;)

++

Extraire des résultats en comparant des colonnes

par Ehplod » 30 avr. 2011, 13:52

Salut,

J'ai une table comme ceci :
id | titre | ... | keyword1 | keyword2 | keyword3 | keyword4 |

Je voudrais récupérer les lignes dont les keywords correspondent à ceux que j'ai, mais de manière décroissante

Donc, récupérer les id dont les 4 keyword corresponde aux miens (classé par id décroissant), puis lorsque seul 3 keyword correspondent (classé par id décroissant), puis 2 keyword (classé par id décroissant) et enfin 1 seul keyword (classé par id décroissant).

J'ai réussi, mais c'est une véritable usine, donc, je n'en parle pas pour pas donner de mauvaises idées.

Merci