Poblème requête SQL

Petit nouveau ! | 6 Messages

23 janv. 2012, 18:44

Salut,

Je vous présente mon problème :

Je possède 2 tables :

* Une avec les commentaires :

id | titre | pseudo | commentaire | date

* Un deuxième avec les commentaire des commentaires de la table 1 :

id | Pseudo | commentaire | commentaire_id | date

Elle sont jointe grâce au commentaire_id.

Sur ma page d'accueil des commentaires ( http://www.toucheatoncube.fr/commentaires/index.php ), les commentaires sont classé par id décroissant alors que j'aimerai les classé en fonction du dernier commentaire de commentaire créé. (je sais pas si je suis clair :wink: )

Donc sur une page de test j'essaye des requêtes:

http://www.toucheatoncube.fr/commentaires1/index.php

Code : Tout sélectionner

<?php /* Connexion à la BDD */ require "config.php"; mysql_connect($adresse, $nom, $motdepasse); mysql_select_db($database); ?> <table id="tableau_forum" border="1"> <?php $sql="SELECT DISTINCT commentaire_id FROM comment ORDER BY id DESC"; $req = mysql_query($sql) or die(mysql_error()); while($data = mysql_fetch_assoc($req)) { $sql2= "SELECT * FROM commentaires WHERE id = {$data['commentaire_id']}"; $req2= mysql_query($sql2) or die(mysql_error()); while($data2 = mysql_fetch_assoc($req2)){ ?> <tr> <td><a href="comment.php?id=<?php echo $data2['id']; ?>"><?php echo stripslashes($data2['titre']);?></a></td> <td><?php echo stripslashes($data2['pseudo']);?></td> <td><?php echo date("d/m/Y G:i", strtotime($data2['date'])); ?></td> </tr> </tr> <?php } } ?> </table>
Comment les classé en fonction du dernier commentaire de commentaire créé ?
C'est cette requête qui bloque :
$sql="SELECT DISTINCT commentaire_id FROM comment ORDER BY id DESC";

Merci de votre aide ! :D

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2012, 20:00

Deux tables pour stocker la même chose ? :shock:
La seconde table se suffit à elle même.

Si j'ai bien compris, voilà en plus simple :
SELECT id FROM comment WHERE commentaire_id IS NULL ORDER BY id DESC
Si commentaire_id est null c'est que c'est le commentaire père.
S'il n'est pas null c'est un commentaire de commentaire...
(je sais pas si je suis clair :wink: )
Aucunement. xD

Petit nouveau ! | 6 Messages

23 janv. 2012, 20:14

T'as pas l'air d'avoir compris ( oui je suis pas clair !! :wink: )

clique sur les liens de mon premier post tu comprendras peut etre mieux.

Je pense que le problème viens de la requête :

Code : Tout sélectionner

$sql="SELECT DISTINCT commentaire_id FROM comment ORDER BY id DESC";
C'est le DISTINCT qui me pose problème, il me sélectionne la première entrée, donc la plus ancienne alors que j'aimerai que ce soit la plus récente qui soit sélectionner.
la encore, je ne pense pas être clair ...

Merci quand même de ta réponse !

ViPHP
xTG
ViPHP | 7331 Messages

23 janv. 2012, 21:01

Mouais je vois... Sauf que du fait de ta structure de bdd qui n'est pas correcte c'est pas des plus simple... :/

Essais ceci :
SELECT id, (SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS derniere_date FROM commentaires ORDER BY derniere_date DESC

Petit nouveau ! | 6 Messages

23 janv. 2012, 21:30

La j'ai une erreur qui n'a peut être rien à voir :

Code : Tout sélectionner

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
Mon code est :
<?php
	
	/*
	Connexion à la BDD
	*/
	require "config.php";
	mysql_connect($adresse, $nom, $motdepasse);
	mysql_select_db($database);
	
	?>
    
	<table id="tableau_forum" border="1">
    
	<?php
	$sql="SELECT id, (SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS derniere_date FROM commentaires ORDER BY derniere_date DESC";
	$req = mysql_query($sql) or die(mysql_error());
	
	while($data = mysql_fetch_assoc($req)) {

	$sql2= "SELECT * FROM commentaires WHERE id = {$data['commentaire_id']}";
	$req2= mysql_query($sql2) or die(mysql_error());
	
		while($data2 = mysql_fetch_assoc($req2)){
		?>
	  <tr>
        <td><a href="comment.php?id=<?php echo $data2['id']; ?>"><?php echo stripslashes($data2['titre']);?></a></td>
    	<td><?php echo stripslashes($data2['pseudo']);?></td>
    	<td><?php echo date("d/m/Y G:i", strtotime($data2['date'])); ?></td>
  </tr>
     </tr>
	<?php
    }
	}
	?>
</table>
-------------------------------------------------------------------------------------------------------------------------------------

Enfaite voila ce que je veux mais sans les doublon http://www.toucheatoncube.fr/commentaires1/index.php

Le code de cette page :
<?php
	
	/*
	Connexion à la BDD
	*/
	require "config.php";
	mysql_connect($adresse, $nom, $motdepasse);
	mysql_select_db($database);
	
	?>
    
	<table id="tableau_forum" border="1">
    
	<?php
	$sql="SELECT * FROM comment ORDER BY id DESC";
	$req = mysql_query($sql) or die(mysql_error());
	
	while($data = mysql_fetch_assoc($req)) {

	$sql2= "SELECT * FROM commentaires WHERE id = {$data['commentaire_id']}";
	$req2= mysql_query($sql2) or die(mysql_error());
	
		while($data2 = mysql_fetch_assoc($req2)){
		?>
	  <tr>
        <td><a href="comment.php?id=<?php echo $data2['id']; ?>"><?php echo stripslashes($data2['titre']);?></a></td>
    	<td><?php echo stripslashes($data2['pseudo']);?></td>
    	<td><?php echo date("d/m/Y G:i", strtotime($data2['date'])); ?></td>
  </tr>
     </tr>
	<?php
    }
	}
	?>
</table>

ViPHP
xTG
ViPHP | 7331 Messages

24 janv. 2012, 10:06

Dans ta seconde requête, commentaire_id est à remplacer par id.

Par contre ma requête placera les commentaires ne possédant pas de réponses en dernier à cause du NULL renvoyé pour la date.
Et ça je ne vois pas comment le régler via SQL, ça serait bien plus simple en repensant le MCD...
Car là faut le dire, tu montes une usine à gaz. ^^

Petit nouveau ! | 6 Messages

24 janv. 2012, 19:23

Bonsoir,

Tout a fait d'accord avec xTG, c'est typiquement une table réflexive.

Pour avoir la première occurence je ferais (c'est pas moi qui le fait) un magnifique UNION.
Ou bien un peu de récursif ? Dommage je ne crois pas que MySQL gère le récursif :(

Bonne réception.

Petit nouveau ! | 6 Messages

25 janv. 2012, 17:07

Salut,

Ça marche, je suis trop content !!

Pour les commentaires ne possédant pas de réponses, un simple if au début avec une requête qui sélectionnerai seulement les commentaires sans réponses ne suffirait pas ? pour les placer au début ?

Après pour les supprimer de la requête :
SELECT id, (SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS derniere_date FROM commentaires ORDER BY derniere_date DESC
Il fuadrais rajouter une condition disant de ne pas selectionner ceux qui ont une réponse null, et ca, je ne sais pas le faire !! Toi, peux être.

Merci beaucoup de ton aide en tout cas !! :D

ViPHP
xTG
ViPHP | 7331 Messages

25 janv. 2012, 17:45

J'aime vraiment pas faire du code sale. Mais vu que tu n'as pas l'air décidé à vouloir faire mieux. :/
SELECT id, (SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS derniere_date FROM commentaires WHERE dereniere_date IS NOT NULL ORDER BY derniere_date DESC

Petit nouveau ! | 6 Messages

25 janv. 2012, 18:37

Ta requête ne marche pas :
Unknown column 'derniere_date' in 'where clause'
Et quel est la requête pour sélectionner les commentaire qui n'ont pas de commentaire de commentaire ?
J'arrive pas à la faire, j'en suis ici :
SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS comnull FROM commentaires WHERE comnull IS NULL ORDER BY id DESC
J'ai la même erreur que pour la tienne :
Unknown column 'comnull' in 'where clause'

ViPHP
xTG
ViPHP | 7331 Messages

25 janv. 2012, 19:33

Hum mouais... Les valeurs du select découlent de la clause where donc c'est une aberration ce que je t'ai proposé...
Tu peux toujours faire le tri après la récupération des valeurs via une condition PHP.

Pour les commentaires sans commentaire :
SELECT id FROM commentaires WHERE (SELECT count(id) FROM comment WHERE commentaires.id = comment.commentaire_id) = 0 ORDER BY date DESC

Petit nouveau ! | 6 Messages

25 janv. 2012, 22:14

Je te remercie car grâce à toi j'ai réussi !!!

Mais par contre il me reste un problème du à la requête :
SELECT id, (SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS derniere_date FROM commentaires ORDER BY derniere_date DESC
Vu que le IS NOT NULL ne fonctionne pas, les commentaires qui n'ont pas de réponse (commentaire de commentaire) se retrouve à la fin or je voudrais qu'il n'y soit pas.

Tu m'as donc proposé :
Tu peux toujours faire le tri après la récupération des valeurs via une condition PHP.
Et la je ne comprend pas. Peux tu être plus clair ?

De plus, peux m'expliquer le fonctionnement de cette requête sql car je l'utilise mais je ne comprend pas comment elle fonctionne !
SELECT id, (SELECT MAX(date) FROM comment WHERE comment.commentaire_id = commentaires.id) AS derniere_date FROM commentaires ORDER BY derniere_date DESC
Merci d'avance.