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:

MySQL et fonctions


le Visiteur

Messages recommandés

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;

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

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!

Lien vers le commentaire
Partager sur d’autres sites

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...

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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...