0

我有以下正在工作的查询:

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

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

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

有人可以帮我加入这个附加表吗?

提前致谢!

4

2 回答 2

2

那里发生了很多事情...

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

自加入 (*lesson_requests INNER JOIN (SELECT stuff from course_requests*) 也有点令人困惑,尽管我可以看到你正在尝试做什么(即,获取每个学生的记录以及最大请求日期)。

最后,像“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。如果该假设不适用,您需要弄清楚 vendor 和 course_requests 是如何相关的,并使用这些列进行连接。

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

于 2012-06-13T23:01:33.310 回答
0

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

于 2012-06-13T22:44:11.867 回答