Select sur 2 tables [Résolu]

Signaler
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006
-
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006
-
Salut
alors voila!!!!
Dans une base sql, j'ai 2 tables identiques en structure (je tenais a séparer les données au début et je me vois mal revoir toute ma prog)
Ces 2 tables ont un champ nb_vu (pour le nombre de fois vu)
et je cherche a faire un select sur ces 2 tables pour récupérer les entrés les plus vu!!!!

Vous avez pigé?
Utiliser les 2 tables comme si elles étaient dans la meme!!!
Mais bien les tables ne sont pas liés (dans table 1 j'ai les article de type 1 et dans table 2 ceux de type 2)

Je cherche donc a faire une requete du type
SELECT * FROM Table1,Table2 ORDER BY nb_vu LIMIT 0, 5;
et ca me donerais les articles les plus vu parmis les 2 tables
mais la requette ci dessu ne tourne pas!!!!
Je sais pas comment faire !!!!Et sql n'est pas mon fort!!!

---Perig---
Pour vous servir 8-)
Et parfois en galère :blush)
Souvent même :)

7 réponses

Messages postés
393
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
29 septembre 2008

salut

je fait cour c la deuxieme fois que j'ecris le mess a cause d'un plantage.... grrrrr

3 solutions :

1- tu fait ton traitement en deux fois.... avec une fonction par exemple et tu retourne ta soluce

SELECT * FROM Table1 ORDER BY nb_vu LIMIT 0, 5;
query...
while(mysql_fetch_object($res)){
ta_fonction(tes_vars);
}
SELECT * FROM Table2 ORDER BY nb_vu LIMIT 0, 5;
query...
while(mysql_fetch_object($res)){
ta_fonction(tes_vars);
}

2- tu cree une table temporaire avec tes données et tu fait ton traitement sur cette table temporaire. ensuite tu detruit ou tu la vide comme ca a la reexecution pas de probleme (perso moi je creer o debut de ma page et je detruit une fois mon traitement terminer

3- je sais pas mais si tu trouve dit moi jai deja chercher et jai pas trouver de soluce... autre que ca (perso jai utiliser la deuxième)
et le traitement pour moi reste rapide et javai trois tables

j'espere que ca va t'aider

++

"Aucun de nous ne sait ce que nous savons tous, ensemble."
Lao Tseu inventeur du "copier coller" 8-)
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006

Re!!!
je crois avoir trouvé la solution !!!
il faut utiliser UNION
ca donne :
(SELECT * FROM table1 ORDER BY nb_vu DESC LIMIT 5)UNION(SELECT * FROM table2 ORDER BY nb_vu DESC LIMIT 5)
...
UNION(SELECT * FROM tablex ORDER BY nb_vu DESC LIMIT 5)ORDER BY nb_vu DESC LIMIT 0,5;

---Perig---
Pour vous servir 8-)
Et parfois en galère :blush)
Souvent même :)
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006

Finalement, c'est pas une bonne idée "UNION" car moi il me fallait connaître pour chaque résultat la table d'origine.

J'ai donc scanné chaque table et j'ai récupéré que les 5 premiers résultats que je classe dans un tableau sous la forme
$liste[$i]=(sprintf("%04d", $res['view']))."_".$res['id']."_".$table;
soit :
$liste[$i]="nb de fois vu (sur 4 chiffres)"_"id de l'enregistrement"_"table"
ensuite je classe mon tableau avec un simple
rsort($liste);
et j'affiche les 5 premiéres lignes de mon tableau ce qui me donne bien le top 5!!!
---Perig---
Pour vous servir 8-)
Et parfois en galère :blush)
Souvent même :)
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006

Merci lol
Mais la 2e risque d'étre trés longue car j'ai environ 12 tables(pour chaque type d'article j'ai une table.)
. Avec 20 a 30 articles dans chaques (pour le moment alors que le site n'est pas référencé )
Je vais donc chercher une méthode 3 et si je trouve je te donnerais la solution!!! ;)

---Perig---
Pour vous servir 8-)
Et parfois en galère :blush)
Souvent même :)
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006

ps : pour récupérer l'id et le nom de la table j'ai plus qu'a casser ma chaine en fonction du séparateur "_" (qui n'est jamais dans mes nom de tables)

---Perig---
Pour vous servir 8-)
Et parfois en galère :blush)
Souvent même :)
Messages postés
393
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
29 septembre 2008

salut

ma version de mysql ne prend pas les "union" j'avais deja tester mais jy ai pas repenser en écrivant ma réponse vu que ca marche pas chez moi :sad)
de plus jai le meme probleme que toi je doit connaitre ma table d'origine... jai donc mis dans ma table temporaire un autre champ indiquant la provenance...
Sinon ta solution en triant ta liste est pas mal mais pour moi ca compliquerai ma solution, jai 8 tri différents a faire sur ma table.... pour en ressortir différentes statistiques (en plus la ca marche :big) )
fodra que je pense a "rsort" le prochain coup ca pourrait considérablement simplifier des morceaux de codes

++

"Aucun de nous ne sait ce que nous savons tous, ensemble."
Lao Tseu inventeur du "copier coller" 8-)
Messages postés
358
Date d'inscription
vendredi 1 novembre 2002
Statut
Membre
Dernière intervention
5 septembre 2006

Oui moi enfait j'au 3 types de tables. Avec pour chaque type environ 10 tables (vi je sais c'est pas le top mais bon!!!!)
et je n'ai que a récupérer les articles les plus vu pour chaque type et les nouveaux articles donc pas plus de 6 requettes * le nb de tables. C'est vrais que ca m'en fait 60 en tout a chaque chargement de la page index mais bon, visiblement ca pose pas de prob.
encore merci de ton aide ;)
---Perig---
Pour vous servir 8-)
Et parfois en galère :blush)
Souvent même :)