requete hardue

VaN
Mammouth du PHP | 1107 Messages

30 nov. 2005, 16:04

$sql_get_threads = 	"SELECT p.post_id, p.poster_id, username, user_id, t.topic_id, t.topic_title
								FROM frm_posts AS p, frm_topics AS t, frm_users AS u
								WHERE u.username LIKE '%GG%' 
								AND u.username LIKE '%".$result_get_pseudo['pseudo']."%'
								AND u.username LIKE '%|%'
								AND u.user_id = p.poster_id
								AND p.topic_id = t.topic_id
								AND (CHAR_LENGTH(u.username)='".($long+5)."' OR CHAR_LENGTH(u.username)='".($long+6)."')
								ORDER  BY post_id DESC 
								LIMIT 0 , 3";
J'aimerais récupérer post_id, poster_id, username, user_id, topic_id, topic_title. Mais j'aimerais récuperer seulement un seul exemplaire de topic_title (et donc topic_ic), si le topic est le meme, histoire que ce titre ne soit pas répété dans mon while() qui suit.

lorsque je met
"SELECT p.post_id, p.poster_id, username, user_id, 
								DISTINCT t.topic_id, DISTINCT t.topic_title
								FROM frm_posts AS p, frm_topics AS t, frm_users AS u
, il me sors l'erreur #1064 - Erreur de syntaxe près de 'DISTINCT t.topic_id, DISTINCT t.topic_title
FROM frm_posts AS p' à la ligne 1.

Faut-il faire autrement ? (la structure des tables est celle de phpBB.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 nov. 2005, 16:26

Le mot-clé "DISTINCT" veut dire "ligne unique" pour SQL et non "valeur unique de champ". C'est pour celà que DISTINCT doit être appliqué à la ligne de sortie et non à chaque champ de la ligne.

L'écriture correcte est :
SELECT DISTINCT champ1, champ2,.... FROM table

Mais il faut encore préciser, et justement pour ton cas, que DISTINCT élimine les doublons de lignes où toutes les valeurs des champs se répètent.

Exemple :
Tuple sans DISTINCT :
  • A1, B1, C1
    A1, B1, C1
    A1, B1, C2
    A1, B1, C2
    A1, B2, C1
devient avec le DISTINCT :
  • A1, B1, C1
    A1, B1, C2
    A1, B2, C1
Autrement dit, si tu applique le DISTINCT à ta requête :

Code : Tout sélectionner

SELECT DISTINCT p.post_id, p.poster_id, username, user_id, t.topic_id, t.topic_title ...
Elle doit éliminer les lignes doublons et notamment les t.topic_title en double si et seulement si les valeurs p.post_id, p.poster_id, username, user_id, t.topic_id se répetent aussi quand t.topic_title se répete.

Préconisation:
Toutefois, si tu veux récupèrer les titres uniques des topic ainsi que leurs id, il faut les chercher dans leur table "frm_topic" là où ils sont uniques.

ou bien, si c'est pour des soucis d'affichage, n'afficher le titre qu'une seule fois quand il change lors du parcours du résultat de la requête sous PHP.
Modifié en dernier par sadeq le 30 nov. 2005, 16:36, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

VaN
Mammouth du PHP | 1107 Messages

30 nov. 2005, 16:36

Elle doit éliminer les lignes doublons et notamment les t.topic_title en double si et seulement si les valeurs p.post_id, p.poster_id, username, user_id, t.topic_id se répetent aussi quand t.topic_title se répete.
Ah oui mais justement, p.post_id etant un identifiant unique, il est en auto increment, il y'a donc aucune chance que le DISTINCT me coup les lignes dont t.topic_title et t.topic_id sont identiques: /

Il y'a t'il une autre solution ?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

30 nov. 2005, 16:38

Oui, la solution la plus simple est décrite dans le message suivant :
http://www.phpfrance.com/forums/voir_su ... texte-.php
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

VaN
Mammouth du PHP | 1107 Messages

30 nov. 2005, 16:54

C'est bon j'ai reussi à recuperer les infos comme je voulais. merci sadeq pour cette info sur l'utilisation du DISTINCT