Petite question requete sql en PHP

vin-moi
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 391
Inscription: 22 Nov 2004

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 discret
WRInaute discret
 
Messages: 245
Inscription: 18 Jan 2005

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 passionné
WRInaute passionné
 
Messages: 1536
Inscription: 11 Mai 2005

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 occasionnel
WRInaute occasionnel
 
Messages: 391
Inscription: 22 Nov 2004

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 occasionnel
WRInaute occasionnel
 
Messages: 260
Inscription: 8 Aoû 2006

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 impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

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 discret
WRInaute discret
 
Messages: 245
Inscription: 18 Jan 2005

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 impliqué
WRInaute impliqué
 
Messages: 551
Inscription: 2 Avr 2004

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 occasionnel
WRInaute occasionnel
 
Messages: 391
Inscription: 22 Nov 2004

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 passionné
WRInaute passionné
 
Messages: 1536
Inscription: 11 Mai 2005

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 passionné
WRInaute passionné
 
Messages: 1874
Inscription: 17 Déc 2006

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 occasionnel
WRInaute occasionnel
 
Messages: 391
Inscription: 22 Nov 2004

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 passionné
WRInaute passionné
 
Messages: 1874
Inscription: 17 Déc 2006

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 occasionnel
WRInaute occasionnel
 
Messages: 391
Inscription: 22 Nov 2004

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 discret
WRInaute discret
 
Messages: 245
Inscription: 18 Jan 2005

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

Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

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