Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL子查询重用_Php_Sql_Mysql - Fatal编程技术网

Php MySQL子查询重用

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

嘿,伙计们。我有一个相当笨拙的sql查询:

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