Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/08/2011, 15h09   #1
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Par défaut Afficher les données de plusieurs tables par date en une seule liste.

Bonjour à tous !

Je suis confronté à un problème qui m'agace et qui me coince un peu... Je m'explique. Je possède plusieurs tables pour les différents commentaires sur mon site. J'ai donc les tables suivantes :
- comments_news (id_comments, id_externe, pseudo, commentaire, date)
- comments_tests (pareil)
- comments_videos (pareil)
- comments_soluces (pareil)

En gros je souhaite créer un bloc avec les dix derniers commentaires sur mon site. Si j'avais tout regroupé en une seule table, ca aurait été facile mais là je sais pas comment faire. J'ai réfléchi à une manière de faire mais je sais pas du tout si c'est faisable... Je prends les dix derniers commentaires de chaque table, donc en tout ça me ferait 40 variables à retenir. Puis je trie ces variables par date et j'affiche les 10 dernières... Dans la théorie ça a l'air simple mais dans la pratique je me dis que je peux faire plus facile...

J'espère que vous pourriez m'aider à me débloquer et me donner des idées...

Merci d'avance !
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 15h22   #2
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
La solution la plus simple ce sont les unions de mysql :

http://dev.mysql.com/doc/refman/5.0/fr/union.html

Tu fait un union des 4 recherches des 4 derniers tu trie par date et tu prends les 10 derniers
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/08/2011, 15h37   #3
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Merci déjà pour ta réponse !

Alors j'ai un peu regardé même si j'ai pas tout compris... En gros je ferais un truc comme ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<?php
$reponse = mysql_query("(SELECT * FROM comments_news ORDER BY id LIMIT 10)
UNION
(SELECT * FROM comments_tests ORDER BY id LIMIT 10)
UNION
(SELECT * FROM comments_videos ORDER BY id LIMIT 10)
UNION
(SELECT * FROM comments_soluces ORDER BY id LIMIT 10)
ORDER BY date LIMIT 10");
 
$donnees = mysql_fetch_array($reponse);
 
?>
Bon je me suis peut-être trompé sur certaines choses, notamment les parenthèses ou les guillemets, mais est-ce que dans l'idée je suis assez proche de ce que je dois faire ?
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 17h30   #4
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Oui
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/08/2011, 18h13   #5
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Bon j'ai réussi à faire afficher les commentaires ! Merci, merci merci !

Par contre, maintenant faut que je trouve un moyen de faire des liens pour chaque commentaire, mais j'avoue que ça coince encore plus...
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 18h27   #6
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Pas vraiment :p

Au lieu de faire des select * tu rajoute un select 'xx' AS Type, id_comments, id_externe, pseudo, commentaire, date from ...

avec le xx qui change en fonction de la table pour connaitre le type de commentaires ou directement le calcul de l url si c'est possible
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/08/2011, 18h51   #7
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Je peux créer autant de "AS" que je veux ?
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 18h52   #8
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Tu peut expliciter ta question ?
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/08/2011, 19h03   #9
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Ben, dans les tables que j'ai actuellement, je n'ai que le strict nécessaire... Ma question serait de savoir si je peux créer de fausses variables dans la requete SQL et si oui, si je peux en faire tant que je veux :p
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/08/2011, 19h07   #10
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Alors la réponse est oui
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/09/2011, 21h29   #11
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Je :up: le topic car j'ai besoin d'aide de nouveau. J'aimerais créé des fausses variables comme j'ai demandé plus haut mais je vois pas comment faire. JE vais expliquer quelle variable je voudrais créer.

Pour (SELECT * FROM comments_news ORDER BY id LIMIT 10) j'aimerais créer une variable qui s'appelle "adresse" et qui aurait comme contenu la chaine de caractères "news.php?article=". Comment je pourrais m'y prendre en sachant qu'une variable "adresse" sera aussi créée pour les autres requêtes mais elle serait différente ?

Merci !
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 22h25   #12
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Hum hum hum je t'ai donner la réponse plusieurs posts plus haut déjà

Code :
select 'news.php?article=' AS adresse, id_comments, id_externe, pseudo, commentaire, date from comments_news ORDER BY id LIMIT 10
Effectivement il faut changer le xxx et Type de mon exemple mais je pense que tu pouvais le faire
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/09/2011, 22h43   #13
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Non mais je suis complètement débile xD En fait, je confondais avec "INSERT INTO"... Je pensais qu'il fallait utiliser une "value" ^^ Je crois que je devrais reprendre les cours de sql de zéro parce que je me sens très très con !

Merci !
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/09/2011, 23h09   #14
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Bon, maintenant je me pose la question, toujours sur ces mêmes requetes SQL (heureusement ^^).

Pour compléter mon adresse, j'ai besoin de récupérer dans une autre table une valeur via un paramètre SQL établi plus haut : le id_externe. En effet, dans le cas de news, j'aimerais récupérer une information de la table "news" où la news possède le même id que "id_externe". Je pensais faire une sous-requête mais je vois pas trop où...

Code :
1
2
3
4
5
6
<?php
$reponse = mysql_query("(SELECT 'news.php?article=' AS adresse, '(SELECT article FROM news WHERE id=id_externe)' AS article, id_comments, id_externe, pseudo, commentaire, date FROM comments_news ORDER BY id LIMIT 10)
UNION
...
ORDER BY date LIMIT 10");
?>
Mais j'ai l'impression que c'est pas possible... Une idée ?

Merci d'avance et désolé pour le dérangement :p
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 08h26   #15
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Il faut utiliser une jointure

Code :
SELECT a.x , b.y from a left join b on (a.id = b.id)
(Exemple très basique).

Je pense qu'effectivement tu devrais aller refaire un tour du coté des tutos SQL proposé ici
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2011, 17h26   #16
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Je t'avoue que j'ai énormément de mal avec les jointures... Est-ce que je suis loin de la bonne solution ?

Code :
1
2
3
4
5
6
7
8
9
SELECT 'news.php?article=' AS adresse, id_comments, id_externe, pseudo, commentaire, date 
 
FROM comments_news 
 
LEFT JOIN news
 
ON news.id = comments_news.id_externe
 
ORDER BY id LIMIT 10
Je suis désolé de poser de telles questions mais j'avoue que je ne comprends pas grand chose en jointure...
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 17h34   #17
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Pas très loin

Code :
1
2
3
4
5
6
7
8
9
SELECT 'news.php?article=' AS `adresse`, `comments_news`.`id_comments`, `comments_news`.`id_externe`, `comments_news`.`pseudo`, `comments_news`.`commentaire`, `comments_news`.`date` , `news`.`article`
 
FROM `comments_news`
 
INNER JOIN `news`
 
ON ( `news`.`id` = `comments_news`.`id_externe` )
 
ORDER BY `news`.`id` LIMIT 10
Pour être plus propre et plus rapide.

Par contre je suppose qu'il manque quelque chose car si tu fait une jointure c'est normalement pour récupérer une information de la table news j'ai rajouter au hasard le news.article a toi de mettre les bonnes valeurs
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/09/2011, 17h39   #18
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Merci à toi, maintenant deux questions :

1) Est-ce que ce serait plus rapide de donner des noms plus courts à mes tables lors de cette requête SQL ?

2) Lorsque je voudrais récupérer les données pour les afficher sur le site, je devrais écrire $donnees['news.article'] ?

Merci d'avance ^^
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/09/2011, 18h32   #19
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
Il est vrai qu'il est plus facile de demander que d'aller lire les tutos

1) Pas plus rapide mais plus simple pour décrire tes jointures et les valeurs que tu veux recupérer.

2) Non, seul le nom de la colonne est pris en compte, ce qui peut poser des soucis si tu ramène plusieurs colonne de plusieurs tables ayant le même nom c'est pour cela que tu peut utiliser une nouvelle fois l'opérateur AS.

Code :
SELECT `comments_news`.`id_comments` AS `id_com`...
Qui sera ensuite vu comme id_com.
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/09/2011, 22h34   #20
Candidat au titre de Membre du Club
 
Inscription : novembre 2008
Messages : 81
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 81
Points : 10
Points : 10
Je voudrais te remercier grandement car j'ai enfin pu modifier mon code et ça marche impeccablement ! Merci, merci, merci ! (et en plus j'ai tout compris :p )
Romanodi13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h31.


 
 
 
 
Partenaires

Hébergement Web