Petite question requete sql en PHP

WRInaute occasionnel
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!
 
WRInaute passionné
Si tous les tags sont différents :
Code:
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.
 
WRInaute discret
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
 
WRInaute occasionnel
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...
 
WRInaute discret
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 ...
 
WRInaute occasionnel
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
 
WRInaute occasionnel
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:
"(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 !
 
WRInaute passionné
vin-moi a dit:
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)
 
WRInaute passionné
Joe Le Mort a dit:
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.
 
WRInaute occasionnel
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
 
WRInaute occasionnel
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 :(
 
WRInaute discret
webmasterlamogere a dit:
Joe Le Mort a dit:
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.
voila la solution par webmasterlamogere et moi :wink:
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut