IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Tri après passage en php 5.4 [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut Tri après passage en php 5.4
    Bonjour,
    Je viens de migrer mon serveur et je suis donc passé en PHP 5.4 et 5.5.41 pour le serveur Mysql
    j'avais une requête imbriqué qui marchait très bien au niveau d'une messagerie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select3 = "SELECT id_message,sid_group,date_lu,heure_lu,expediteur,texte_message FROM (SELECT * FROM messagerie WHERE destinataire= '".$_SESSION['refID']."' AND status NOT LIKE '2' ORDER BY date_envoi DESC, heure_envoi DESC) AS messagerie GROUP BY messagerie.expediteur ORDER BY messagerie.date_envoi DESC";
    cela me permettais d'avoir une liste de messages avec les plus récent en haut de liste, suivant la date et l'heure, je ne m'explique pas pourquoi cela ne marche plus au niveau de l'ordre.

    Quelqu'un a t'il une explication, est ce a cause de la migration?

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi pas simplement comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select3 = "SELECT id_message,sid_group,date_lu,heure_lu,expediteur,texte_message FROM messagerie WHERE destinataire= '".$_SESSION['refID']."' AND status <> 2 ORDER BY date_envoi DESC, heure_envoi DESC";
    Au passage il n'y a pas d'interet a séparer la date et l'heure.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut Tri après passage en php 5.4
    Bonjour sabotage,

    Simplement parce la constitution de la base ne le permet pas, voila je m'explique...
    C'est une messagerie, les messages sont enregistrés de ma manière suivante dans la base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Pour exemple:
    ID, id_expediteur, id_destinataire, date_expedition, heure_expedition, texte, message_lu
    c'est la page liste des messages par nom d’expéditeur, après on clique sur le nom et une autre page fait apparaître les messages.

    Donc je suis obligé d'utiliser un GROUP BY pour n'afficher qu'une fois l’expéditeur. ensuite je voudrais que suivant le dernier message reçu, l'affichage de l'expediteur soit en haut c'est pour cela que j'ai besoin de la date et l'heure.

    Ce qui est curieux c'est que cela marchait très bien avant ma migration serveur.

    Merci Sabotage,

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu veux dire que tu veux le dernier message de chaque expéditeur ?

    Ta requête fait un groupement par expediteur mais quelle ligne doit-elle retourner ? Ce n'est pas indiqué dans la requête donc mysql te fournit un résultat comme ça lui chante.
    GROUP BY s'utilise avec des fonctions d'aggrégation (SUM, COUNT, MAX etc.).
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Oui tout a fait c'est ce que je désire, je veux qu'il m'affiche le dernier message de l'expediteur qui correspond a un ID "id_message" qui est trier par date et heure.
    Si le GROUP BY n'est pas adapté, je dois utiliser quoi SELECT DISTINCT?

    Nom : Sans-titre-1.jpg
Affichages : 124
Taille : 38,3 Ko

    c'est en gros la configuration de ma base... pour être plus explicite...

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Encore une fois, regroupe la date et l'heure, c'est beaucoup plus simple pour faire le tri.
    Ici je fais comme si c'était le cas :
    La technique consiste à récupérer la date MAX pour chaque expediteur dans une sous-requête et joindre pour avoir les autres colonnes :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_message,sid_group,date_lu,heure_lu,expediteur,texte_message
    FROM messagerie t1 
    JOIN (SELECT MAX(date_expedition) as date_expedition, id_expediteur FROM messagerie GROUP BY id_expediteur) t2
    ON t1.date_expedition = t2.date_expedition AND t1.id_expediteur = t2.id_expediteur
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Bonjour Sabotage,
    Excuse moi pour le retard a te répondre, mais ma migration serveur m'a pris tout mon temps, bon comme tu m'as conseillé j'ai créé un champ DATETIME que j'ai appelé timestamp_envoi mais bon c'est un DATETIME et insérer ton code avec quelques changements de nom de champs et l'ajout du destinataire... car il y en a plusieurs...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select3 = "SELECT id_message,sid_group,expediteur,date_lu,heure_lu,texte_message FROM messagerie t1 WHERE destinataire= '".$_SESSION['refID']."' JOIN (SELECT MAX(timestamp_envoi) AS timestamp_envoi FROM messagerie WHERE destinataire= '".$_SESSION['refID']."' GROUP BY expediteur)t2  ON t1.timestamp_envoi = t2.timestamp_envoi AND t1.expediteur = t2.expediteur";
    Mais je me retrouve avec une erreur

    You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JOIN (SELECT MAX(timestamp_envoi) AS timestamp_envoi FROM messagerie WHERE desti' at line 1
    Merci,

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $select3 = "SELECT id_message,sid_group,expediteur,date_lu,heure_lu,texte_message FROM messagerie t1 JOIN (SELECT MAX(timestamp_envoi) AS timestamp_envoi FROM messagerie WHERE destinataire= '".$_SESSION['refID']."' GROUP BY expediteur) t2  ON t1.timestamp_envoi = t2.timestamp_envoi AND t1.expediteur = t2.expediteur
    WHERE destinataire= '".$_SESSION['refID']."'";
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Oui pardon ! je venais de me rendre compte de ma connerie !

    mais cela me donne une autre erreur !

    Unknown column 't2.expediteur' in 'on clause'

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    tu as enlevé l'expediteur de ma sous requête.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Bonjour,
    Ok pardon, j'ai rectifié l'erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select3 = "SELECT id_message,sid_group,expediteur,date_lu,heure_lu,texte_message FROM messagerie t1 JOIN (SELECT MAX(timestamp_envoi) AS timestamp_envoi,expediteur FROM messagerie WHERE destinataire= '".$_SESSION['refID']."' GROUP BY expediteur) t2  ON t1.timestamp_envoi = t2.timestamp_envoi AND t1.expediteur=t2.expediteur WHERE destinataire= '".$_SESSION['refID']."'";
    Maintenant j'ai cette erreur...

    Column 'expediteur' in field list is ambiguous

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    ça c'est du SQL pur : tu as deux tables, qui contiennent toutes les deux une colonne "expediteur". Il faut donc préciser laquelle des deux colonnes tu veux récupérer.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Bonjour Celira,

    Non justement je n'ai pas deux tables, mais qu'une...
    Je sais que l'erreur...

    Column 'expediteur' in field list is ambiguous
    est parce que mes tables ou plutôt ma table a le même nom de colonne, le problème est comment contourner cela...

    Merci

  14. #14
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Non justement je n'ai pas deux tables, mais qu'une...
    Oui, bien entendu, tu n'as qu'une seule table en jeu dans ta requête : dont l'alias est t1 et t2...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Oui, bien entendu, tu n'as qu'une seule table en jeu dans ta requête : dont l'alias est t1 et t2...
    Oui et ?

    c’était juste un commentaire gratuit? ça fait avancer quoi que ce soit?

  16. #16
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ce que Bovino essaye d'expliquer c'est que 2 alias sur une même table, c'est pareil que 2 tables pour le SQL.
    Donc pour toutes les colonnes qui se trouvent à la fois dans t1 et t2, il faut préciser dans quelle "table" tu vas la chercher.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Merci Celira, comme quoi il est toujours préférable de dialoguer et d'expliquer, plutôt que de répondre a une question par une autre question ou balancer des phrases stériles, expliquer les choses sont toujours plus claires...

    bon très bien, je comprends ce que tu veux dire, mais alors ma question est la suivante, comment faire cela ?

    Car au départ Sabotage m'a gentiment ouvert cette voie, mais j'ai besoin d'exemple pour analyser et comprendre...

    il faut préciser dans quelle "table" tu vas la chercher.
    que dois je rajouter ?

    Merci

  18. #18
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ben, la même chose que pour faire ta jointure soit "t1" soit "t2"

    Par exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_message, sid_group, t1.expediteur, date_lu, heure_lu, texte_message 
    FROM messagerie t1 
    JOIN (SELECT MAX(timestamp_envoi) AS timestamp_envoi, expediteur FROM messagerie WHERE destinataire= '".$_SESSION['refID']."' GROUP BY expediteur) t2  
    ON t1.timestamp_envoi = t2.timestamp_envoi AND t1.expediteur=t2.expediteur
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  19. #19
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2012
    Messages : 50
    Points : 23
    Points
    23
    Par défaut
    Très bien merci Celira, je comprend, je n'ai plus d'erreur... par contre je n'ai aucun tri, cela m'affiche tous les enregistrements... le GROUP BY expediteur ne fonctionne plus

  20. #20
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    J'espère que tu n'as pas copié-collé bêtement mon code, pasque je n'ai repris qu'une partie de la requête...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/03/2015, 19h14
  2. Problème après "passage" en xhtml1.0
    Par Becafuel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 16/12/2005, 15h19
  3. Réponses: 19
    Dernier message: 14/11/2005, 09h53
  4. Réponses: 1
    Dernier message: 28/10/2005, 10h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo