Php MySQL子查询重用
嘿,伙计们。我有一个相当笨拙的sql查询:Php MySQL子查询重用,php,sql,mysql,Php,Sql,Mysql,嘿,伙计们。我有一个相当笨拙的sql查询: SELECT username, users.photo_url, fp, dp,users.vid, GLength(LineStringFromWKB(LineString(AsBinary(PointFromText('POINT({$geolat} {$geolong})')), AsBinary(location)))) AS dista
SELECT username, users.photo_url, fp, dp,users.vid,
GLength(LineStringFromWKB(LineString(AsBinary(PointFromText('POINT({$geolat} {$geolong})')),
AsBinary(location)))) AS distance
FROM users
INNER JOIN venues ON users.vid = venues.vid
LEFT JOIN deflects ON users.username = deflects.defender
WHERE username NOT LIKE '{$mysql['username']}'
AND username NOT LIKE '{$users['king']['username']}'
AND venues.location IS NOT NULL
HAVING
(distance <= (
SELECT MAX(distance) AS max_distance
FROM (
SELECT
GLength(LineStringFromWKB(LineString(AsBinary(PointFromText('POINT({$geolat} {$geolong})')),
AsBinary(location))))
AS distance
FROM users
INNER JOIN venues ON users.vid = venues.vid
LEFT JOIN deflects ON users.username = deflects.defender
WHERE users.fp = 0
AND username NOT LIKE '{$mysql['username']}'
AND username NOT LIKE '{$users['king']['username']}'
AND venues.location IS NOT NULL
AND deflects.dp IS NULL
ORDER BY distance LIMIT 5
) AS unfrozen)
OR vid = '{$vid}')
ORDER BY distance
选择用户名、users.photo\u url、fp、dp、users.vid、,
GLength(LineStringFromWKB(LineString(作为二进制(PointFromText('POINT({$geolat}{$geolong})))),
AsBinary(location)))作为距离
来自用户
用户上的内部连接场馆。vid=场馆。vid
左连接在用户身上偏转。用户名=偏转。防御者
其中用户名不象“{$mysql['username']}”
用户名与“{$users['king']['username']}”不同
和。位置不为空
有
(距离=@max、@c+1、@c),
@最大值:=如果(fp=0
dp为空
和@d>=@max
和@c使用存储过程..伪代码-如果需要,我将稍后修复代码,但这可能会让您自己开始找到答案。MySQL允许您做疯狂的事情
SELECT
username,
distance
FROM
(
SELECT
username,
@d:=distance AS distance,
@c := if(fp = 0
AND dp IS NULL
AND @d>=@max, @c+1, @c),
@max := if(fp = 0
AND dp IS NULL
AND @d>=@max
AND @c <= 5, @d, @max) MaxOf5Dist
FROM (select @max:=-1000, @d:=null, @c:=0) M
INNER JOIN (
SELECT
username, # others taken out for brevity
users.fp, deflects.dp,
GLength(LineStringFromWKB(LineString(AsBinary(
PointFromText('POINT({$geolat} {$geolong})')), AsBinary(location))))
AS distance
FROM users
CROSS JOIN venues ON users.vid = venues.vid
LEFT JOIN deflects ON users.username = deflects.defender
WHERE username NOT LIKE '{$mysql['username']}'
AND username NOT LIKE '{$users['king']['username']}'
AND venues.location IS NOT NULL
ORDER BY distance
) X
) Y
WHERE vid = '{$vid}' OR distance <= MaxOf5Dist
ORDER BY distance
选择
用户名,
距离
从…起
(
挑选
用户名,
@d:=作为距离的距离,
@c:=if(fp=0
dp为空
和@d>=@max、@c+1、@c),
@最大值:=如果(fp=0
dp为空
和@d>=@max
@c这ORDER BY DISTANCE LIMIT 5
意味着你只想要最接近的5个中的最大值?是的,这就是它的意思…我将尝试在下面处理你的伪代码。谢谢你的帮助。天哪,这太疯狂了。这几乎完美了,尽管我不得不在最后将距离比较改为“distance@Chris我的交叉连接错误。我确实说过MySQL太疯狂了-我最初让它交叉连接到那里的M
(变量)派生表。你必须使用
SELECT
username,
distance
FROM
(
SELECT
username,
@d:=distance AS distance,
@c := if(fp = 0
AND dp IS NULL
AND @d>=@max, @c+1, @c),
@max := if(fp = 0
AND dp IS NULL
AND @d>=@max
AND @c <= 5, @d, @max) MaxOf5Dist
FROM (select @max:=-1000, @d:=null, @c:=0) M
INNER JOIN (
SELECT
username, # others taken out for brevity
users.fp, deflects.dp,
GLength(LineStringFromWKB(LineString(AsBinary(
PointFromText('POINT({$geolat} {$geolong})')), AsBinary(location))))
AS distance
FROM users
CROSS JOIN venues ON users.vid = venues.vid
LEFT JOIN deflects ON users.username = deflects.defender
WHERE username NOT LIKE '{$mysql['username']}'
AND username NOT LIKE '{$users['king']['username']}'
AND venues.location IS NOT NULL
ORDER BY distance
) X
) Y
WHERE vid = '{$vid}' OR distance <= MaxOf5Dist
ORDER BY distance