2012-09-13 20 views
0

嗨,我真的很挣扎让下面的SQL查询工作,我提前道歉,如果ive做了这个捣烂,但即时通讯仍然学习SQL的全部高级领域。另一个MYSQL加入问题

这里是我的代码...

"SELECT *,(((acos(sin((".$latitude."*pi()/180)) * 
sin((`latitude`*pi()/180))+cos((".$latitude."*pi()/180)) * 
cos((`latitude`*pi()/180)) * cos(((".$longitude."- `longitude`)*pi()/180)))) 
*180/pi())*60*1.1515) as distance 
FROM `locations` l HAVING distance <= '".$distance."' JOIN 
(SELECT * users) u 
ON (l.id = u.basic_location) 
      WHERE u.id != A $AND2 
      ORDER BY distance ASC" 

我不断收到以下错误消息......

You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 
'JOIN (SELECT * users) u ON (l.id = u.basic_location) WHERE u.id' at line 1 

我用尽许多这样的组合,但香港专业教育学院成为难倒,并寻找一些帮帮我?

+0

尝试把你的距离相比,在where子句中 – WhiteboardDev

回答

2
  1. JOIN应该FROM tablename之后跟随或其他JOIN
  2. 你应该用WHERE,不HAVING在这种情况下
  3. 你应该JOIN users u,而不是子查询(在这种情况下,它是没有意义的)
+0

是correctiong这一点,并改变问题感谢稍微修正非常多。 – JSweete

1

试试这个

"SELECT *, 

     ((((SELECT 
     acos(
      sin((".$latitude."*pi()/180)) * 
      sin((`latitude`*pi()/180))+ 
      cos((".$latitude."*pi()/180)) * 
      cos((`latitude`*pi()/180)) * 
      cos(((".$longitude."- `longitude`)*pi()/180)) 
      ))*180/pi())*60*1.1515) as distance 
    FROM `locations` l)X 
    JOIN users u 
ON (X.id = u.basic_location) 
WHERE u.id != A $AND2 
AND distance <= '".$distance."' 
ORDER BY distance ASC" 

变化

1)HAVING distance <=需要改变,以WHERE distance <=。请注意,使用HAVING子句过滤只有当你有一个像SUM任何聚合函数,COUNT等。对于任何正常的过滤操作使用WHERE子句

2)加入语法是:

SELECT t1.* 
FROM Table1 t1 
JOIN Table2 t2 
ON t1.Id = t2.Id 
Where t1.<Some condition> 
AND t2.<some Condition> 

而且不

SELECT t1.* 
FROM Table1 t1 Where t1.<Some condition> 
JOIN Table2 t2 
ON t1.Id = t2.Id 
Where t2.<some Condition> 

如果需要加入,然后不喜欢

SELECT X.*,Y.* 
FROM (SELECT * FROM Table1 t1 Where t1.<Some condition>) X 
JOIN (SELECT * FROM Table2 t2) Y 
ON X.Id = Y.Id 
Where Y.<some Condition> 

希望你能理解之前,从第一个表进行筛选。

+0

这不会因为错误太多而工作 – zerkms

+0

我没有MySQL编辑器(所以可能是格式不正确)。但请检查我提供的意见。它必须在任何数据库中工作。 –

+1

小贴士:在您的查询中查找WHERE存在问题 – zerkms

1
select * from 
(SELECT *, 
(((acos(sin((".$latitude."*pi()/180)) * 
sin((`latitude`*pi()/180))+ 
cos((".$latitude."*pi()/180)) * 
cos((`latitude`*pi()/180)) * 
cos(((".$longitude."- `longitude`)*pi()/180))))* 
180/pi())*60*1.1515) as distance 
FROM `locations` l INNER JOIN 
`users` u 
ON l.id = u.basic_location 
WHERE u.id != A $AND2) derived_table dt 
where dt.distance <= '".$distance."' 
ORDER BY dt.distance ASC 
+0

您好,感谢使用这个显示“每个派生表必须有自己的别名”的任何想法不同的错误? – JSweete

+0

@JSweete请参阅update:derived_table dt – Nathan