0

こんにちは、私は次の SQL クエリを機能させるのに本当に苦労しています。これをマッシュアップした場合は前もってお詫びしますが、SQL の完全な高度な領域をまだ学んでいます。

これが私のコードです...

"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

私はこれの多くの組み合わせを試しましたが、私は困惑し、助けを探していましたか?

4

3 に答える 3

2
  1. JOIN直後FROM tablenameまたは別に従う必要がありますJOIN
  2. この場合WHEREではなく、を使用する必要がありますHAVING
  3. サブクエリではなく、すべきですJOIN users u(この場合は意味がありません)
于 2012-09-13T05:06:06.923 に答える
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 <=。SUM 、COUNT などの集計関数がある場合にのみ、フィルタリングにHAVING 句を使用することに注意してください。通常のフィルタ操作では、 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>

ご理解いただければ幸いです。

于 2012-09-13T05:08:44.710 に答える
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
于 2012-09-13T05:17:21.480 に答える