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 :

Requete SELECT multi-tables avec un ORDER BY


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Requete SELECT multi-tables avec un ORDER BY
    Bonsoir,

    Je voudrais envoyer la requête suivante en une seule fois:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "SELECT * FROM t_membres, t_sponsors ORDER BY mem_date ASC, mem_heure ASC";

    Le soucis c'est que le serveur m'affiche mes sponsors en 2 fois et que mes membres n'apparaissent pas.

    Quelqu'un saurait-il me corriger mon erreur ? Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ajoute une clause GROUP BY pour grouper les sponsors ensemble.
    Je te déconseille l'usage de *, si tu as des champs qui portent les mêmes noms dans les deux tables (ça arrive) tu va avoir des erreurs.

    Tu réalise ta jointure avec un produit cartésien, il vaut mieux utiliser une jointure avec la clause JOIN et ON :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT a.`name`, a.`surname`, a.`job` FROM `users` AS a JOIN `jobs` AS b ON (a.`jobs_id`=b.`id`) ORDER BY a.`name`;
    Pour répondre à ta question, il me faut les desc de tes deux tables:

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    GROUP BY ne sert pas juste à calculer la somme de plusieurs chiffres ?

    Sinon, je le fais à l'ancienne: 2 requêtes pour 2 résultats différents.
    Ca ne me parait pas très pro, Mais bon! à la guerre comme à la guerre.

    Pour mes champs, il n'y a pas de problème, je les différencie par un préfixe de trois lettre portant le nom de la table.

    Merci de ta part.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 191
    Points : 275
    Points
    275
    Par défaut
    ben c'est simple si tu met * et que le résultat provient de plusieurs tables le moteur ne sais pas quel champ de quelle table prendre (enfin c'est ce que j'ai remarqué avec mysql). pour ma part je spécifie à chaque de quelle table je veux le résultat comme cela plus d'ambiguïté.
    donc pour moi ta requete serai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "SELECT t_membres.*, t_sponsors.* FROM t_membres, t_sponsors ORDER BY t_membres.`mem_date` ASC, t_membres.`mem_heure` ASC"
    normalement avec ca tu devrai avoir le bon résultat

    c'est lourd comme écriture mais si tu créer un builder c'est easy, tu te pose plus de question c'est toujours pareil
    enfin de mon point de vue
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $query_builder = new QueryBuilder();
    $query_builder->appendField(Society::TABLE, '*');
    $query_builder->appendField(Group::TABLE, '*');
    $query_builder->appendField(Role::TABLE, '*');
    $query_builder->appendField(User::TABLE, '*');
    $query_builder->appendFrom(Society::TABLE);
    $query_builder->appendJoinField(Group::TABLE, 'group_id', Society::TABLE, 'group_id');
    $query_builder->appendJoinField(Role::TABLE, 'role_id', Society::TABLE, 'role_id');
    $query_builder->appendJoinField(User::TABLE, 'user_id', Society::TABLE, 'user_id');
    $query = $query_builder->createSelect();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT new_society.*,new_group.*,new_role.*,phpbb_users.*
    FROM new_society
    LEFT JOIN new_group
    ON new_group.`group_id` = new_society.`group_id`
    LEFT JOIN new_role
    ON new_role.`role_id` = new_society.`role_id`
    LEFT JOIN phpbb_users
    ON phpbb_users.`user_id` = new_society.`user_id`

Discussions similaires

  1. SELECT multi Table avec pointeur dynamique
    Par gabouille dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 11/12/2013, 14h41
  2. Requete difficile multi table avec multi champ
    Par jujoluca dans le forum Requêtes
    Réponses: 9
    Dernier message: 07/06/2012, 19h59
  3. Réponses: 4
    Dernier message: 27/03/2012, 17h15
  4. Selection multi table avec filtre
    Par curumo dans le forum Requêtes
    Réponses: 6
    Dernier message: 20/11/2009, 23h16
  5. Requete multi table avec LIMIT et ORDER BY
    Par yobogs dans le forum Requêtes
    Réponses: 1
    Dernier message: 31/10/2006, 17h29

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