复杂的MySQL语句导致错误

时间:2016-05-29 01:05:21

标签: mysql select

我试图将两个工作的sql语句组合成一个工作的sql语句。

以下是两个sql语句,每个语句在单独完成时都有效:

第一个选择产品所在的所有产品和商店,以及产品所属的类别,用于特定区域的商店。它用于在网站上显示产品,然后在每个产品下列出产品的商店和类别。

SELECT p.p_id, p.`p_name`, p.brand, 
GROUP_CONCAT( DISTINCT CONCAT(c.c_id, ':', c.c_name) SEPARATOR ', ' ) as categories, 
GROUP_CONCAT( DISTINCT CONCAT(s.s_id, ':', s.s_name) SEPARATOR ', ' ) as shops 
FROM product p 
INNER JOIN product_category pc on p.p_id = pc.p_id 
INNER JOIN category c ON c.c_id = pc.c_id 
INNER JOIN product_shop ps on p.p_id = ps.p_id 
INNER JOIN shop s ON s.s_id = ps.s_id 
WHERE s.street = 'college hill' 
AND s.city = 'auckland' 
AND s.province = 'auckland' 
AND s.country = 'new zealand' 
AND s.postalCode = '1011'

我的顶级sql语句的结果如下所示:

enter image description here

重要提示:我已经在商店表中添加了纬度和经度字段,这对于此问题中的下一个sql语句非常重要

第二个sql语句取自this link that finds the closest 20 shops to a latlong coordinate in a table of shops。我已经调整它以使用我的数据库:

SELECT s_id, ( 3959 * acos( cos( radians(-36.8473223
) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(174.744227
) ) + sin( radians(-36.8473223
) ) * sin( radians( latitude ) ) ) ) AS distance FROM shop HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

它给出了这个结果:

enter image description here

因此,通过结合这两个sql语句,我可以选择最接近latlong坐标的商店中的产品,在网站上显示产品,然后显示每个产品的商店和类别。

我想要做的就是从给定的纬度和经度坐标(由用户使用谷歌自动完成的地点对象输入)添加商店的距离到我发布的顶部图像的商店选择结果这个问题中的sql语句。所以在商店的结果中,每个商店只需添加一个类似于5.897的距离结果。并返回距离最近的条目。

这是我目前的尝试:

    SELECT p.p_id, 
    p.`p_name`, 
    p.brand, 
    GROUP_CONCAT(DISTINCT CONCAT(c.c_id, ':', c.c_name) SEPARATOR ', '
    ) as categories, 
    GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name, ':', 
( 3959 * acos( cos( radians(-36.8473223
    ) ) * cos( radians( s.latitude ) ) * cos( radians( s.longitude ) - radians(174.744227
    ) ) + sin( radians(-36.8473223
    ) ) * sin( radians( s.latitude ) ) ) ) AS distance) SEPARATOR ', '
    ) as shops
    FROM 
    product p 
    INNER JOIN product_category pc on p.p_id = pc.p_id 
    INNER JOIN category c ON c.c_id = pc.c_id 
    INNER JOIN product_shop ps on p.p_id = ps.p_id 
    INNER JOIN shop s ON s.s_id = ps.s_id HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

我收到此错误:

  

1583 - 调用本机函数'CONCAT'

时参数不正确

我该怎么做才能解决错误?

以下答案的结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

你有一个&#34; As Distance&#34;在你的concat中,然后完成gorup concat&#34; Shops&#34;。

我重写了你的查询。来自商店的PREQUERY计算您的距离,并且您的限制为20个条目...然后它加入到链的其余部分。因为&#34;距离&#34;是计算列,现在可以在concat语句中使用。

SELECT 
      p.p_id, 
      p.p_name,
      p.brand,
      GROUP_CONCAT( DISTINCT CONCAT(c.c_id, ':', c.c_name) 
         SEPARATOR ', ' ) as categories, 
      GROUP_CONCAT(DISTINCT CONCAT(s.s_id, ':', s.s_name, ':', 
         s.distance ) SEPARATOR ', ' ) as shops
   from
      ( SELECT 
              s_id, 
              s.s_name,
              ( 3959 
                * acos( cos( radians( -36.8473223 ) ) 
                * cos( radians( latitude ) ) 
                * cos( radians( longitude ) 
                - radians( 174.744227 ) ) 
                + sin( radians( -36.8473223 ) ) 
                * sin( radians( latitude ) ) ) ) AS distance 
           FROM 
              shop 
           HAVING 
              distance < 25 
           ORDER BY 
              distance 
           LIMIT 
              0, 20 ) s
      INNER JOIN product_shop ps 
         ON s.s_id = ps.s_id 
         INNER JOIN product p 
            on ps.p_id = p.p_id
            INNER JOIN product_category pc 
               on p.p_id = pc.p_id 
               INNER JOIN category c 
                   ON pc.c_id = c.c_id
   group by
      p.p_id,
      p.p_name,
      p.brand