Petite question requete sql en PHP

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

vin-moi
WRInaute impliqué
WRInaute impliqué
 
Messages: 391
Inscription: Lun Nov 22, 2004 18:13

Petite question requete sql en PHP

Message le Dim Juil 15, 2007 16:49

Salut :)

Voilà j'ai une petite question concernant une requete sql en PHP :

J'ai trois tables contenant des textes de différents types, et trois tables contenant les tags de chaque article.

J'essaye de selectionner les 30 tags les plus utilisé pour créer un nuage. Lors qu'il s'agit de selectionner ses 30 tags pour une des trois tables, c'est assez simple.

ca donne par exemple :

$sqlTags = "SELECT tag, count(*) as iterations
FROM actualites_tags
GROUP BY tag ORDER BY iterations DESC
LIMIT 0, 30";

Le soucis, c'est que je souhaite également faire la même chose, mais sur les trois tables en même temps, est-ce faisable ?

J'ai essayé en faisant une jointure mais evidemment ce n'est pas du tout le résultat attendu :

$sqlTags = "SELECT a.tag, b.tag, c.tag, count(*) as interations
FROM dossiers_tags a, actualites_tags b, fichprat_tags c
GROUP BY a.tag, b.tag, c.tag ORDER BY interations DESC
LIMIT 0, 30";


En fait, ca serait de faire en sorte que les tables soient "collées" et qu'il fasse le tri parmi les trois tables en même temps !

Vous avez une piste ?

merci d'avance!


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Re: Petite question requete sql en PHP

Message le Dim Juil 15, 2007 17:27

Regarde du côté de FULL OUTER JOIN pour faire ta jointure entre tables ...


arnaudmn
WRInaute accro
WRInaute accro
 
Messages: 1483
Inscription: Mer Mai 11, 2005 18:20

Message le Dim Juil 15, 2007 17:36

Si tous les tags sont différents :
Code: Tout sélectionner
SELECT tag, count(*) as iterations
FROM actualites_tags
GROUP BY tag
union
SELECT tag, count(*)
FROM dossiers_tags
GROUP BY tag
union
SELECT tag, count(*)
FROM fichprat_tags
GROUP BY tag
order by iterations desc


Si le même tags est présent dans 2 tables, tu auras 2 lignes.

vin-moi
WRInaute impliqué
WRInaute impliqué
 
Messages: 391
Inscription: Lun Nov 22, 2004 18:13

Message le Dim Juil 15, 2007 17:47

Malheureusement les tags peuvent être les mêmes :(

je cherche des infos sur vos solutions quand même !


Joe Le Mort
WRInaute impliqué
WRInaute impliqué
 
Messages: 255
Inscription: Mar Aoû 08, 2006 14:13

Message le Dim Juil 15, 2007 18:47

eessaye de mettre tes résultats séparés dans des tableaux PHP et tu les regroupe dans un seul.

Apres tu joues sur les fonctions array (pour les trier et ordonner) pour ton nuage


ltressens
WRInaute passionné
WRInaute passionné
 
Messages: 551
Inscription: Ven Avr 02, 2004 14:52

Message le Lun Juil 16, 2007 7:54

UNION peut être écrit : UNION ALL ou UNION DISTINCT, donc la solution de arnaudmn fonctionne avec UNION DISTINCT qui ne fera qu'une seule ligne dans le cas d'un tag présent dans deux tables...


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Message le Lun Juil 16, 2007 8:49

Sauf que ça n'a aucun intérêt d'utiliser un UNION DISTINCT ici, puisque j'imagine quand même qu'il voudrait faire la somme des occurrences des tags sur les trois tables et classer suivant cela ...


ltressens
WRInaute passionné
WRInaute passionné
 
Messages: 551
Inscription: Ven Avr 02, 2004 14:52

Message le Lun Juil 16, 2007 9:04

Oui effectivement,
Alors ca peut donner qqchose dans le genre :

SELECT tag, sum(iterations) as iterations
FROM (
SELECT tag, count(*) as iterations
FROM actualites_tags
GROUP BY tag
UNION
SELECT tag, count(*) as iterations
FROM dossiers_tags
GROUP BY tag
UNION
SELECT tag, count(*) as iterations
FROM fichprat_tags
GROUP BY tag
)
GROUP BY tag
ORDER BY iterations DESC

vin-moi
WRInaute impliqué
WRInaute impliqué
 
Messages: 391
Inscription: Lun Nov 22, 2004 18:13

Message le Lun Juil 16, 2007 10:14

Salut,

héhé merci pour tous vos conseils, vous êtes vraiment sympas ! :lol:

J'ai donc abouti grace à vos conseils à une requete qui fonctionne au poil :

Code: Tout sélectionner
"(SELECT b.id AS actualite_id, b.titre, b.date, b.texte
   FROM actualites_tags a, actualites_textes b
   WHERE a.actualite_id=b.id
      AND (a.tag IN (" . $tagsReady . "))
   GROUP BY b.id
   HAVING COUNT(b.id)=" . $i . ")
UNION ALL
(SELECT b.id AS dossier_id, b.titre, b.date
   FROM dossiers_tags a, dossiers_proprietes b
   WHERE a.dossier_id=b.id
      AND (a.tag IN (" . $tagsReady . "))
   GROUP BY b.id
   HAVING COUNT(b.id)=" . $i . ")
UNION ALL
(SELECT b.id AS fichprat_id, b.titre, b.date
   FROM fichprat_tags a, fichprat_proprietes b
   WHERE a.fichprat_id=b.id
      AND (a.tag IN (" . $tagsReady . "))
   GROUP BY b.id
   HAVING COUNT(b.id)=" . $i . ")
limit 0, 30";


Mais j'ai encore un petit soucis :D

J'aimerai pour chaque ligne retournée savoir si il s'agit d'une fiche pratique , d'une actu ou d'un dossier (pour pouvoir rediriger vers la bonne rubrique ensuite ).

Comme vous pouvez le voir, j'ai essayé d'identifier les ID différemment selon la "sous requete" : b.id AS actualite_id et ensuite dans la boucle, je vérifie le quel de actualite_id, dossier_id ou fichprat_id n'est pas null pour pouvoir trouver dans quelle rubrique se trouve le résultat.

Malheureusement ca ne fonctionne pas, et quelque soit la provenance de la ligne, c'est le "actualite_id" qui est pris en compte :-(.

Vous auriez une piste ? :D

merci d'avance !


arnaudmn
WRInaute accro
WRInaute accro
 
Messages: 1483
Inscription: Mer Mai 11, 2005 18:20

Message le Lun Juil 16, 2007 12:12

vin-moi a écrit:Comme vous pouvez le voir, j'ai essayé d'identifier les ID différemment selon la "sous requete" : b.id AS actualite_id et ensuite dans la boucle, je vérifie le quel de actualite_id, dossier_id ou fichprat_id n'est pas null pour pouvoir trouver dans quelle rubrique se trouve le résultat.

Malheureusement ca ne fonctionne pas, et quelque soit la provenance de la ligne, c'est le "actualite_id" qui est pris en compte :-(.


Tu ajoute un élément dans chacunes des requetes, pour identifier ce que tu récupère :
SELECT "actu" as quoi, b.id AS actualite_id, b.titre, b.date, b.texte
(etc)


webmasterlamogere
WRInaute accro
WRInaute accro
 
Messages: 1874
Inscription: Dim Déc 17, 2006 21:08

Message le Lun Juil 16, 2007 12:12

Joe Le Mort a écrit:eessaye de mettre tes résultats séparés dans des tableaux PHP et tu les regroupe dans un seul.

Apres tu joues sur les fonctions array (pour les trier et ordonner) pour ton nuage


Le plus simple est de faire les 3 requêtes séparées, de tout mettre dans un tableau et de trier ensuite ce tableau avec un petit sort. C'est facile a coder, à maintenir et surement plus performant en temps de traitement.

vin-moi
WRInaute impliqué
WRInaute impliqué
 
Messages: 391
Inscription: Lun Nov 22, 2004 18:13

Message le Lun Juil 16, 2007 12:31

t'es un chef arnaudmn :)

webmasterlamogere , c'est vrai que ca serait vraiment plus performent, mais à ce moment je vois pas comment retrier ensuite l'ensemble par pertinence :S


webmasterlamogere
WRInaute accro
WRInaute accro
 
Messages: 1874
Inscription: Dim Déc 17, 2006 21:08

Message le Lun Juil 16, 2007 12:57

tu mets ton critère de tri comme première colonne de ton tableau et tu utilises
rsort pour trier en descendant.

vin-moi
WRInaute impliqué
WRInaute impliqué
 
Messages: 391
Inscription: Lun Nov 22, 2004 18:13

Message le Mar Juil 17, 2007 9:45

arf t'a raison puisque en fait le UNION ALL ne mélange pas les trois tables mais donne les résultat pour chaque table à la suite :(


Bh@Mp0
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 245
Inscription: Mar Jan 18, 2005 19:02

Re: Petite question requete sql en PHP

Message le Mar Juil 17, 2007 9:53

Bh@Mp0 a écrit:Regarde du côté de FULL OUTER JOIN pour faire ta jointure entre tables ...

Petite question requete sql en PHP

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités