2010-06-15 2 views
4

c'est la requêtemysql select de problème tables multi-

SELECT 
         members.memberID, 
         members.salutation, 
         members.firstName, 
         members.middleName, 
         members.lastName, 
         members.suffix, 
         members.company, 

         addresses.address1, 
         addresses.address2, 
         addresses.city, 
         addresses.state, 
         addresses.postalCode, 
         addresses.country, 
         addresses.memberID, 

         email.email, 
         email.memberID, 

         phonenumbers.phoneNumber, 
         phonenumbers.memberId, 

         subscriptions.year, 
         subscriptions.memberID 
        FROM 
         members, 
         addresses, 
         email, 
         phonenumbers, 
         subscriptions 
        WHERE 
         subscriptions.year = '%s' 
          AND 
         subscriptions.memberID = members.memberID 
          AND 
         subscriptions.memberID = addresses.memberID 
          AND 
         subscriptions.memberID = email.memberID 
          AND 
         subscriptions.memberID = phonenumbers.memberID 
        ORDER BY 
         members.lastName, 
         members.firstName, 
         members.company 
LIMIT 0, 10 

mon problème est son une énorme demande si Im essayant de limiter à un si grand nombre à la fois ... son supposé avoir plus de 5000 résultats. .. de toute façon la seule limite qui fonctionne est limite 0, 10 si vous faites autre chose 5, 10 ça ne marche pas 0, 50 ne fonctionne pas ... seulement 0, 10 fonctionne ...

et quand je fais 0, 10 la requête retourne blake firstName, middleName, lastName, et quelques autres ... et quand je fais un print_r() sur le résultat $ il les montre aussi vides et il y a la plupart des données de def dans la base de données et il n'y a pas non plus fautes de frappe pour cela ...

+2

Tout d'abord, style agréable. Bon comment vous répétez les noms de tables, rend clair. Pouvez-vous publier les définitions de table (syntaxe CREATE TABLE) et le plan d'exécution (EXPLAIN SELECT ...) de cette requête afin que nous puissions voir quels index sont utilisés? – Konerak

+0

Je suis d'accord, Konerak. Tant d'exemples SQL que nous voyons sont écrits comme si un but important est d'utiliser le moins de lignes de texte possible. La disposition soignée rend cet exemple facile à lire. –

Répondre

1

Je voudrais suggérer l'utilisation de la jointure externe gauche et de l'indexation dans les champs que vous avez utilisés pour relier les deux tables et appliquées dans des conditions. il devrait augmenter performanace ...

que je suis la performance dans les dossiers de 50.000 lignes dans le tableau principal et plusieurs tables de l'enfant avec 10.000 lignes ... ~

try gauche jointure externe correctement et faire une bonne indexation

Modifié: avec instruction SQL:

SELECT 
    subscriptions.year, 
    subscriptions.memberID 

    members.memberID, 
    members.salutation, 
    members.firstName, 
    members.middleName, 
    members.lastName, 
    members.suffix, 
    members.company, 

    addresses.address1, 
    addresses.address2, 
    addresses.city, 
    addresses.state, 
    addresses.postalCode, 
    addresses.country, 
    addresses.memberID, 

    email.email, 
    email.memberID, 

    phonenumbers.phoneNumber, 
    phonenumbers.memberId, 

    FROM 
    subscriptions 
    left outer join members on subscriptions.memberID = members.memberID 
    left outer join addresses on subscriptions.memberID = addresses.memberID 
    left outer join email on subscriptions.memberID = email.memberID 
    left outer join phonenumbers on subscriptions.memberID = phonenumbers.memberID 
    WHERE 
    subscriptions.year = '%s' 
    ORDER BY 
    members.lastName, 
    members.firstName, 
    members.company 
LIMIT 0, 10 
+0

pouvez-vous me dire le code s'il vous plaît parce que je ne peux pas utiliser rejoindre –

+0

dans la section ci-dessus édité vous pouvez soit omettre le mot externe même lors de la création de rejoindre aussi ... – KoolKabin

1

en fonction du nombre d'adresses e-mail et les numéros de téléphone de vos membres ont en moyenne, il pourrait y avoir un problème avec votre requête. Supposons que vous ayez les enregistrements (La plupart des champs omis par souci de concision):

members        addresses    phoneNumbers 
memberId | firstName | lastName  memberId | city  memberId | phoneNumber 
--------------------------------- ------------------- ---------------------- 
839  | Joe  | Hallenbeck 839  | New York 839  | 111-11111 
            839  | L.A.  839  | 222-22222 

Alors ce que votre join ne produit pas est un enregistrement pour Joe Hallenbeck, mais quatre:

memberId | firstName | lastName | city  | phoneNumber 
----------------------------------------------------------- 
839  | Joe  | Hallenbeck | New York | 111-1111 
839  | Joe  | Hallenbeck | New York | 222-2222 
839  | Joe  | Hallenbeck | L.A.  | 111-1111 
839  | Joe  | Hallenbeck | L.A.  | 222-2222 

Je ne sais pas Si c'est ce que vous voulez, mais vous devez savoir que cette requête peut produire beaucoup plus d'enregistrements de résultats que de membres dans la base de données.

Pour plus de conseils, vous devriez publier quelques instructions DDL (create table etc.), comme l'a souligné Konerak.