Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

dans ta table tu ajoute une colonne "fils" ainsi dans ton thread tu recuperes le dernier fils (le 14) et basta :P

et si c'est un pere sans fils alors tu le prends (cas de la ligne 11)

 

sinon, dans l'absolue, pour prendre des données sans doublons on fait :

 

SELECT DISTINCT FROM TABLE;

Posté(e) (modifié)

Alors tu finiras par faire une usine à gaz :-(

 

pour verifier que ton php contient vraiment trop d'appels à cette table et si tu es sous linux :

grep -ri "le_nom_de_ta_table" *

 

cherchera le nom de ta table dans tous les scripts dans tous les repertoires et t'affichera le nom du fichier + la ligne où se trouve "le_nom_de_ta_table"...

 

pour une gestion de thread ; je crois que ce ne serait pas du lux que d'ameliorer la table et changer qq scripts plutot que de partir dans des délires de recherche SQL qui n'aboutiront qu'à ralentir le system :-P

 

en tout cas bon courage ; car je sais ce que c'est de "faire et defaire" :P

Modifié par foxmask
Posté(e)

Merci à tous pour vos suggestions.Alors le but de ma question n'est pas de faire compliqué quand on peut faire simple, mais de savoir si le "faire compliqué" est possible: autrement dit savoir ce que je peux demander à SQL pour une utilisation ultérieure ...

En effet ce cas m'a été soumis par une connaissance qui a récupéré un forum allemand je crois (il n'est lui-même pas français) et souhaitait récupérer pour sa page d'accueil des enregistrements tel que je l'ai décrit.

 

Ca m'a rendu curieux et j'aimerais bien savoir si on peut demander des traitements évolués à SQL.Si quelqu'un a une solution je suis preneur!

Posté(e)

Je suis un peu de l'avis de foxmask sur le fait que la structure de ta table ne se prête guère à ce genre de gymnastique...

Si j'ai bien compris, on doit considérer que les enregistrements dont le titre est "TOTO" et "RE: TOTO" font partie d'un même ensemble dont il ne faut garder qu'un seul élément lorsqu'on cherche les 10 derniers ajoutés ? Oui, là c'est une usine à gaz...

Posté(e)

C'est tout à fait ça KewlCat.Il est évident que c'est plus simple à gérer en PHP, mais au fond qui sait vraiment tout ce que l'on peut demander à MySQL? J'imagine que comme moi la plupart des gens ne lui demande qu'une extraction plus ou moins basique ...

Posté(e)

En fait, si on part de l'hypothèse que la chaîne ajoutée pour les réponses est constante (et vaut 'Re: ') alors ce n'est pas si complexe que ça :

SELECT *
 FROM POSTS P1
WHERE P1.ID = (SELECT MAX(P2.ID)
                 FROM POSTS P2
                WHERE P2.TITRE = P1.TITRE
                   OR P2.TITRE = 'Re: ' || P1.TITRE)
ORDER BY P1.ID 

(et tu n'affiches que les 10 premiers éléments retournés)

Note : si l'opérateur de concaténation || n'existe pas sous MySQL (c'est peut-être spécifique à Oracle ?) il faut utiliser la fonction CONCAT (si elle existe, des fois qu'elle ne soit pas dans MySQL)

Posté(e) (modifié)

Sous MySQL "||" correspond à un "ou" logique j'ai donc utilisé CONCAT().

 

Cependant le code produit une erreur.J'ai pensé à la manière de définir les alias: je ne savais pas qu'on pouvait se passer "as" vu que je l'ai pas vu dans la doc.Du coup je l'ai mis mais l'erreur persiste.

 

En cherchant dans la doc j'ai trouvé ceci "Notez que ANSI SQL ne vous permet pas de vous référer à un alias dans une clause WHERE. Il en est ainsi car lorsque le code de WHERE est exécuté, la valeur de la colonne ne peut pas encore être déterminée".

Je pense que l'erreur vient de là mais je ne vois pas comment définir ce deuxième alias avant la clause WHERE ...

 

SELECT  * 
FROM forum AS v1
WHERE v1.ID = ( 
SELECT MAX( v2.ID ) 
FROM forum AS v2
WHERE v2.subject = v1.subject || v2.subject = CONCAT(  'Re: ',  'v1.subject'  ) 
) 
ORDER  BY v1.ID
LIMIT 10 

Modifié par le Visiteur
Posté(e)

Les alias avec "AS" c'est pour les colonnes (et les formules) de la clause SELECT, pas pour les tables...

Pour indiquer un "ou" dans la clause WHERE il faut utiliser OR. Là tu fais une opération "ou logique" sur v1.subject et v2.subject !

Si tu mets des quotes avant et aprés "v1.subject" dans ton concat, il va te chercher les posts dont le subject est "Re: v1.subject', je suppose que ce n'est pas ce que tu veux...

SELECT  *
 FROM forum v1
WHERE v1.ID = (SELECT MAX(v2.ID)
                 FROM forum v2
                WHERE v2.subject = v1.subject
                   OR v2.subject = CONCAT('Re: ', v1.subject)
              )                                                              
ORDER BY v1.ID
LIMIT 10

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...