2012-06-13 5 views
0

J'ai la requête suivante qui travaille:ont besoin aider à se joindre à une deuxième table

$query = "SELECT 
    a.student_name, 
    city, 
    state, 
    request_date, 
    lat, 
    lng, 
    (3959 * acos( 
     cos(radians('".mysql_real_escape_string($center_lat)."')) 
     * cos(radians(lat)) 
     * cos(radians(lng) - radians('".mysql_real_escape_string($center_lng)."')) 
     + sin(radians('".mysql_real_escape_string($center_lat)."')) 
     * sin(radians(lat)) 
    ) 
    ) AS distance 
    FROM lesson_requests a 
    INNER JOIN (
     SELECT student_name, MAX(request_date) AS MaxRequestDate 
     FROM lesson_requests 
     WHERE ( 
     3959 * acos( 
      cos(radians('".mysql_real_escape_string($center_lat)."')) 
      * cos(radians(lat)) 
      * cos(radians(lng) 
      - radians('".mysql_real_escape_string($center_lng)."')) 
      + sin(radians('".mysql_real_escape_string($center_lat)."')) 
      * sin(radians(lat))) 
    ) < ".mysql_real_escape_string($radius)." 
     GROUP BY student_name 
    ) b 
    ON a.student_name = b.student_name 
    AND a.request_date = b.MaxRequestDate 
    HAVING distance < ".mysql_real_escape_string($radius)." 
    ORDER BY distance 
    LIMIT 0 , 10"; 

Ce que je suis en train de faire est de se joindre à une autre table à la requête appelée « vendeur ». Cette table a une valeur appelée 'user_purchased' et comme l'un des filtres à la fin de la requête complète, je dois m'assurer que 'user_purchased' de la table 'vendor' ne contient pas les mots 'abc_company'. using MATCH like this

...AND NOT MATCH(user_purchased) AGAINST ('abc_company') 

Quelqu'un pourrait-il m'aider avec la jointure de cette table additionnelle?

Merci d'avance!

+1

ce que fait la première requête ont à faire avec la chose des étudiants, du tout? – zebediah49

+3

Veuillez ne pas utiliser les fonctions 'mysql_ *' pour écrire du nouveau code. Ils ne sont plus entretenus et la communauté a commencé [processus de dépréciation] (http://goo.gl/KJveJ). Voir la [* boîte rouge *] (http://goo.gl/GPmFd)? Au lieu de cela, vous devriez en apprendre davantage sur les [instructions préparées] (http://goo.gl/vn8zQ) et utiliser soit [PDO] (http://php.net/pdo) ou [MySQLi] (http://php.net/ mysqli). Si vous ne pouvez pas décider lequel, [cet article] (http://goo.gl/3gqF9) vous aidera. Si vous choisissez PDO, [voici un bon tutoriel] (http://goo.gl/vFWnC). – orourkek

+1

mysql_ * flippe doux et vous le savez ... +1 Bien que – PeeHaa

Répondre

2

Il y a beaucoup de choses là-bas ...

Première , HAVING ne doit être utilisé qu'avec un GROUP BY correspondant. Votre GROUP BY s'applique à la sous-requête (pensez-y en tant que table). Je pense que vous voulez une clause WHERE. L'auto-jointure (* lesson_requests INNER JOIN (SELECT stuff de lesson_requests *) est assez déroutant même si je peux voir ce que vous essayez de faire (à savoir, obtenir l'enregistrement par étudiant avec la date de requête max). ..

Enfin, un varchar comme « nom » fait généralement pour une mauvaise clé primaire Envisager la création d'une sorte d'étudiant entier ID clé de substitution et à l'aide qu'au lieu

Peu importe, je pense que vous voulez quelque chose comme:

SELECT student_name, 
     city, 
     state, 
     request_date, 
     lat, 
     lng, 
     <<DISTANCE COLUMN>> AS distance, 
     vendor.user_purchased 
FROM lesson_requests 
INNER JOIN 
    (
    SELECT student_id, MAX(request_date) AS max_request_date 
    FROM lesson_requests 
    WHERE <<COMPLEX CONDITION>> 
    GROUP BY student_name 
    ) AS recent_student_lesson_request 
    ON lesson_requests.student_name = recent_student_lesson_request.student_name 
     AND lesson_requests.request_date = recent_student_lesson_request.max_request_date 
LEFT JOIN vendor ON v.user_purchased = lesson_requests.student_name 
WHERE vendor.user_purchased <> 'abs_company' 
    AND distance < BLAH; 

Ce joint dans la table vendor en tant que table OPTIONAL et suppose que user_purchased dans la table du fournisseur correspond à student_name. Si cette hypothèse ne s'applique pas, vous devez déterminer la relation entre vendeur et lesson_requests et effectuer la jointure à l'aide de ces colonnes.

Cela encore imprimer un dossier si un ne semble jamais nom_etudiant donné dans le tableau des fournisseurs (parce que, évidemment un étudiant qui n'est pas un fournisseur ne peut pas être le fournisseur « abc_company »)

+0

merci. Je suis confus par un certain nombre de choses: vous appelez pour une table 'recent_student_lesson_request' qu'est-ce que c'est? Aussi, je pense qu'il vous manque la partie: HAVING distance <".mysql_real_escape_string ($ radius)." . C'est là parce que je tire des demandes pour les étudiants dans un certain rayon de mile –

+0

une autre chose, vous utilisez <> 'abc_company'. Je dois utiliser la méthode NOT MATCH parce que je trouve que c'est plus rapide. –

+0

J'ai renommé l'alias pour que cela ait plus de sens. C'est de là que vient le recent_student_lesson_request. Le HAVING fait vraiment partie de la clause WHERE. J'ai modifié l'original pour montrer où je pense que c'est censé aller. – James

0

Si je comprends bien, vous pouvez ajouter « ET table.user_purchased! = « » Abc_company « » » qui résoudra votre problème

+0

J'ai ajouté AND NOT MATCH (vendor.user_purchased) CONTRE ('abc_company') et cela n'a pas fonctionné –

Questions connexes