需要帮助加入第二张桌子

时间:2012-06-13 22:35:25

标签: php mysql

我有以下查询正在运行:

$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";

我要做的是将另一个表加入名为“vendor”的查询中。该表有一个名为'user_purchased'的值,作为完整查询末尾的过滤器之一,我必须确保名为'vendor'的表中的'user_purchased'不包含单词'abc_company'。像这样使用MATCH

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

有人可以帮我加入这个额外的表吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

那里有很多事情......

首先,HAVING只应与相应的GROUP BY一起使用。您的GROUP BY适用于子查询(将其视为表)。我想你想要一个WHERE子句。

自我加入(* lesson_requests INNER JOIN(来自lesson_requests *的SELECT内容)有点令人困惑,虽然我可以看到你想要做的事情(即,每个学生获得最长请求日期的记录)。 / p>

最后,像“name”这样的varchar通常会导致错误的主键。考虑创建某种整数学生ID代理键并改为使用它。

无论如何,我认为你想要这样的东西:

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;

这作为可选表加入供应商表,并假设供应商表中的user_purchased对应于student_name。如果该假设不适用,您需要弄清楚供应商和lesson_requests是如何相关的,并使用这些列进行连接。

如果给定的student_name从未出现在供应商表中,这仍将打印出一条记录(因为,显然不是供应商的学生不能是供应商'abc_company')

答案 1 :(得分:0)

如果我理解正确,你可以添加“AND table.user_purchased!=''abc_company''” 这将解决您的问题