Requête SQL 2 tables

Signaler
-
 omlaly -
Bonjour,

Je cherche à sélectionner les commentaires de l'article correspondant.

Voici les CREATE TABLE des 2 tables :
ARTICLES :
CREATE TABLE IF NOT EXISTS `articles` (
  `id_article` int(11) NOT NULL AUTO_INCREMENT,
  `nom_village` varchar(255) CHARACTER SET latin1 NOT NULL,
  `nom_categorie` varchar(255) CHARACTER SET latin1 NOT NULL,
  `date_depot` datetime NOT NULL,
  `titre_article` varchar(255) NOT NULL,
  `texte_article` text NOT NULL,
  `auteur_article` varchar(255) NOT NULL,
  PRIMARY KEY (`id_article`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=80 ;


COMMENTAIRES :
CREATE TABLE IF NOT EXISTS `commentaires` (
  `id_commentaire` int(11) NOT NULL AUTO_INCREMENT,
  `user_pseudo` varchar(255) NOT NULL,
  `id_village` int(11) NOT NULL,
  `date_depot` datetime NOT NULL,
  `texte_commentaire` text NOT NULL,
  PRIMARY KEY (`id_commentaire`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;


Est-ce qu'il ne faut pas faire une requête SQL imbriquée ?

En attendant vos réponses, je continue mes recherches...
Cordialement

71 réponses

Bonjour,

J'ai essayé cette requête SQL mais elle ne fonctionne pas :
$query_selection_article_correspondant mysql_query("SELECT a.date_depot, a.titre_article, a.texte_article, a.auteur_article c.nom, c.commentaire FROM commentaire AS c INNER JOIN id_commentaires AS a ON c.id_commentaire a.titre_article;)") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL;


J'ai cherché et j'ai vu qu'il faut faire soit une requête imbriquée soit une sous-requête.

En attendant vos réponses, je continue mes recherches...
Cordialement
Désolé de tous ces messages postés mais c'est pour vous informer des requêtes SQL testées et de leur résultat.

Donc, je vous mets la dernière requête SQL testée :
$query_selection_article_correspondant mysql_query("SELECT commentaires.*, (select articles.id_article FROM articles where articles.date_depot commentaires.date_depot)  FROM commentaires") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL;


Voici ce qu'elle retourne :
Resource id #7


Si une âme charitable a une idée, elle ne serait pas de refus...

Je continue mes recherches...
Cordialement
J'ai cherché sur Internet et j'ai vu qu'il fallait faire une requête avec INNER JOIN.

Êtes-vous d'accord ?
Cordialement
Je reviens vers vous avec cette requête SQL :
$query_selection_article_correspondant mysql_query("SELECT titre_article FROM articles INNER JOIN commentaires ON (articles.titre_article commentaires.titre_article)") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL;

.

Voici ce qu'elle affiche :
Erreur sur la requête SQL concernant la sélection de l'article correspondantColumn 'titre_article' in field list is ambiguous


Je continue mes recherches...
Cordialement
En recherchant sur le net, j'ai vu que c'était parce qu'il ne savait pas quel champs choisir, j'ai donc préfixé le champs, je vous mets la dernière version :
$query_selection_article_correspondant mysql_query("SELECT titre_article.articles FROM articles INNER JOIN commentaires ON (articles.titre_article commentaires.titre_article)") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL


Voici ce que ça donne maintenant :
Erreur sur la requête SQL concernant la sélection de l'article correspondantUnknown column 'titre_article.articles' in 'field list'


Je continue mes recherches...
Cordialement
J'ai réussi, mantenant j'ai plus d'erreur, voici la requête :
$query_selection_article_correspondant mysql_query("SELECT 'titre_article.articles' FROM articles INNER JOIN commentaires ON (articles.titre_article commentaires.titre_article)") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL


Maintenant, quand il n'y a pas de commentaire, ça m'affiche :
Pas de commentaire pour l'instant
donc c'est normal.

Par contre, quand il y a des commentaires, ça m'affiche la même chose...

Je me demande, donc, si c'est la bonne requête SQL qu'il faut effectuer...

Cordialement
J'ai trouvé la requête SQL qui est la suivante :
$query_selection_article_correspondant = mysql_query("SELECT * FROM articles, commentaires WHERE articles.titre_article=commentaires.titre_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL


Mais maintenant, il faut capter le titre de l'article sur lequel l'utilisateur poste son commentaire. Et, c'est là que je bloque...

Si une âme charitable a une idée, elle ne serait pas de refus...

Je continue mes recherches...
Cordialement
Pour information, quand je le fais à la main, ça marche.
Quand j'effectue cette requête SQL (
SELECT texte_commentaire FROM articles, commentaires WHERE articles.titre_article=commentaires.titre_article
sur PHPMyAdmin, ça m'affiche le texte du commentaire alors que quand j'effectue cette requête SQL à partir du site, ça m'affiche :
Resource id #7

Resource id #8


Alors que je voudrais afficher le texte du commentaire qui correspond au bon article qui lui même doit correspondre au bon village...

Je vous mets le code PHP de la page où je voudrais que les messages soient affichés, le voici :
// Requête SQL pour déterminer l'identifiant de l'article correspondant - le faire à l'affichage
$query_selection_article_correspondant = mysql_query("SELECT texte_commentaire FROM articles, commentaires WHERE articles.titre_article=commentaires.titre_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL
if ($query_selection_article_correspondant > 0) {  
echo '
'.$query_selection_article_correspondant.'
';
} 
else
{
echo "Aucun commentaire enregistré.";
}


En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
10
Date d'inscription
lundi 5 avril 2004
Statut
Membre
Dernière intervention
25 février 2013

Fais ta requête sur base de tes id. ==> id_village et id_article.
Rajoute aussi dans ta table user un champs que tu prennes en référence pour retrouver ton com ce sera plus efficace. lors de ton enregistrement de commentaire dans la table comm tu rajoutes un id_user, après tout ce qu'il te reste à faire est :
Select texte_commentaire from commentaire where id_user id_user and datecommentaire ## ou autre param de recherche.

Pour le moment, d'après ce que je vois une simple req est faisable, pas besoin de Inner qui te permettras de faire une requête sur l'intersection de 3 pages (cf tuto sur ce site dont http://www.sqlfr.com/tutoriaux/SYNTHESE-INSTRUCTION-SQL_930.aspx )

Select texte_commentaire from articles, commentaires where articles.id_article = commentaire.id_article and ....
Salut,

Merci de ta réponse, je vais essayer et je te tiens au courant.

Cordialement
Je reviens vers toi, je vais te donner l'ensemble des codes :
Voici la requête INSERT INTO (le code) qui permet d'insérer les articles dans la table "articles" :
$texte_commentaire_article=$_POST['texte_commentaire_article'];
$village=$_POST['villages'];
$titre_article = $donnees_messages['titre_article'];
// Enregistrement du pseudo de l'utilisateur (variable de session) pour pouvoir l'utiliser dans la requête INSERT INTO
$user_pseudo = $_SESSION["user_pseudo"];

// Insertion du commentaire dans la base de données
$req_insertion_texte_commentaire_article = "INSERT INTO commentaires(user_pseudo, nom_village, date_depot, texte_commentaire) VALUE ('$user_pseudo', '$village', now(), '$texte_commentaire_article')";
$query_insertion_texte_commentaire_article = mysql_query($req_insertion_texte_commentaire_article) or die ('Erreur sur la requête SQL concernant l\'insertion des commentaires sur des articles'.mysql_error()); // Envoie une requête à un serveur MySQL


Voici la requête SQL (ensemble du code) qui permet d'afficher les bons commentaires avec les bons villages et surtout les articles correspondants :
$query_categorie mysql_query("SELECT titre_article, texte_article, date_depot, auteur_article FROM articles WHERE nom_categorie 'nom de la categorie' AND nom_village = 'nom du village'") or die('Erreur lors de la requête SQL '.mysql_error()); // Envoie une requête à un serveur MySQL
if(mysql_num_rows($query_categorie) != 0){ // mysql_num_rows retourne le nombre de lignes d'un résultat MySQL
$messagesParPage=5; // Nombre de messages affichés par pages

$retour_total=mysql_query('SELECT COUNT(*) AS id_article FROM articles WHERE nom_categorie = "nom de la categorie" AND nom_village	= "nom du village"')  or die ('Erreur sur la requête SQL concernant le calcul du nombre d\'articles'.mysql_error()); // Envoie une requête à un serveur MySQL -  Récupération du contenu de la requête dans $retour_total
$donnees_total=mysql_fetch_assoc($retour_total); // Rangement de $retour_total sous la forme d'un tableau

$total=$donnees_total['total']; // Récupération du total pour le placer dans la variable $total

// Comptage du nombre de pages
$nombreDePages=ceil($total/$messagesParPage);

if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
{
     $pageActuelle=intval($_GET['page']);
     
     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
     {
          $pageActuelle=$nombreDePages;
     }
}
else
{
     $pageActuelle=1; // La page actuelle est la n°1    
}

$premiereEntree=($pageActuelle-1)*$messagesParPage; // Calculer la première entrée à lire

// La requête SQL pour récupérer les messages de la page actuelle
$retour_messages=mysql_query('SELECT * FROM articles WHERE nom_categorie = "categorie" AND nom_village = "nom du village" ORDER BY id_article DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'') or die ('Erreur sur la requête SQL concernant le nombre d\'articles"'.mysql_error()); // Envoie une requête à un serveur MySQL

while($donnees_messages=mysql_fetch_assoc($retour_messages)) { // Lecture des entrées une à une grâce à une boucle

     // Affichage des messages avec le design
     // nl2br : Insère un retour à la ligne HTML à chaque nouvelle ligne - pour prendre en compte les sauts de ligne dans le message.
     echo ''.nl2br($donnees_messages['titre_article']).',

----

'.nl2br($donnees_messages['texte_article']).',

----

<small>Posté par : '.(stripslashes($donnees_messages['auteur_article']).' - '.dateLongue($donnees_messages['date_depot'])).'</small>

';

echo '
Commentaires.


<form method="POST" action="../../commentaire_post.php"><textarea name="texte_commentaire_article"></textarea>
</form>

';
    // Ajout des sauts de ligne pour espacer les messages (
)		
// Requête SQL pour déterminer l'identifiant de l'article correspondant - le faire à l'affichage
$query_selection_article_correspondant = mysql_query("
SELECT texte_commentaire FROM articles, commentaires, villages WHERE nom_village 'nom du village' AND articles.titre_article commentaires.titre_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL
if ($query_selection_article_correspondant > 0) {  
echo '
'.$query_selection_article_correspondant.'
';
} 
else
{
echo "Aucun commentaire enregistré.";
} 
}
echo 'Page : '; // Centrer la liste des pages pour l'affichage
for($i=1; $i<=$nombreDePages; $i++) // Boucle
{
     // Condition
     if($i==$pageActuelle) // S'il s'agit de la page actuelle
     {
         echo ' [ '.$i.' ] '; 
     }	
     else
     {
          echo ' [adresse.php?page='.$i.' '.$i.'] ';
     }
}
echo '

';
}
else // Aucun résultat
{
echo "

Aucun article à l'heure actuelle...
";
}


Voici les CREATE TABLE deux tables :

ARTICLES
CREATE TABLE IF NOT EXISTS `articles` (
  `id_article` int(11) NOT NULL AUTO_INCREMENT,
  `nom_village` varchar(255) CHARACTER SET latin1 NOT NULL,
  `nom_categorie` varchar(255) CHARACTER SET latin1 NOT NULL,
  `date_depot` datetime NOT NULL,
  `titre_article` varchar(255) NOT NULL,
  `texte_article` text NOT NULL,
  `auteur_article` varchar(255) NOT NULL,
  PRIMARY KEY (`id_article`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=83 ;


COMMENTAIRES
CREATE TABLE IF NOT EXISTS `commentaires` (
  `id_commentaire` int(11) NOT NULL AUTO_INCREMENT,
  `user_pseudo` varchar(255) NOT NULL,
  `nom_village` varchar(255) NOT NULL,
  `nom_categorie` varchar(255) NOT NULL,
  `date_depot` datetime NOT NULL,
  `texte_commentaire` text NOT NULL,
  `titre_article` varchar(255) NOT NULL,
  PRIMARY KEY (`id_commentaire`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ;


Si quelqu'un voit ce qu'il ne va pas, qu'il n'hésite pas à le dire...

En attendant vos réponses, je continue mes recherches...
Cordialement
Désolé de tous ces messages mais dès que j'avance, je poste un mesage pour vous tenir au courant.

Pour essayer, j'ai fait un :
	echo 'ça passe dans le test';
dans ce test if :
if ($query_selection_article_correspondant > 0) {  
echo 'ça passe dans le test';
//echo '
'.$query_selection_article_correspondant.'
';
} 
else
{
echo "Aucun commentaire enregistré.";
} 


et quand j'essaye, ça m'affiche le message donc le test if marche.
Mais quand, je fais un
echo '
'.$query_selection_article_correspondant.'
';

Voici ce que ça m'affiche :
-sur le premier article :
Resource id #8

-sur le deuxième article :
Resource id #7


Alors que je voudrais que ça affiche les commentaires de l'article correspondant tout simplement. Je ne sais pas où il trouve ces textes !

Si quelqu'un a une proposition, je la prends volontiers !

En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Lis la définition de la fonction mysql_query, tu verras que le retour n'est pas celui que tu recherches. Il faut utiliser une fonction de mysql_fetch_xxx pour en tirer des données/info.

Encore du travail à moitié fait.
Démerde toi pour l'intégration.

PS : toujours pas un problème SQL, mais PHP ... rien à faire ici.
Salut

J'ai fait ça :
$query_selection_article_correspondant = mysql_query("SELECT * FROM articles, commentaires WHERE articles.titre_article=commentaires.titre_article") or die ('Erreur sur la requête SQL concernant la sélection de l\'article correspondant'.mysql_error()); // Envoie une requête à un serveur MySQL

if (mysql_fetch_row($query_selection_article_correspondant > 0)) {  
echo '
'.$query_selection_article_correspondant.'
';
} 
else
{
echo "Aucun commentaire enregistré.";
} 


Voici le résultat :
Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in /homez.506/vincentsg/www/acces4roues/villages/aramon/monumentavisiter.php on line 146
Aucun commentaire enregistré.


En attendant vos réponses, je continue mes recherches...
Cordialement

PS : Comment afficher les commentaires correspondant à l'article ? Avec une jointure oui mais comment capter le bon article ? Avec son id...
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Je vais faire court : t'as écrit n'importe quoi.
Une astuce est disponible dans ton message d'erreur (comme souvent).
Un problème dans ma requête SQL ? Quand je la teste sur PHPMyAdmin, elle fonctionne.

Donc, c'est un problème dans le if de PHP.

Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Tain mais lis le message d'erreur !
Et depuis le début tu n'as que des problèmes PHP, jamais SQL.
Il y a une erreur sur le premier paramètre qui doit retourner un résultat booléen.

Cordialement
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Non, le paramètre attendu par la fonction est une resource, toi tu lui files un boolean (traduction pure et dure du message). C'est affligeant de devoir te tenir la main pour des choses aussi basiques.

Bon, je te laisse t'amuser avec tes faux problèmes.
Pense à poser tes questions sur le forum PHP à l'avenir.