我有以下查询正在运行:
$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')
有人可以帮我加入这个额外的表吗?
提前致谢!
答案 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''” 这将解决您的问题