【问题标题】:Complex MySQL statement causing error复杂的 MySQL 语句导致错误
【发布时间】:2016-05-29 11:18:23
【问题描述】:

我正在尝试将两个有效的 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 语句的结果是这样的:

重要提示:我已经在 shop 表中添加了纬度和经度字段,这对于这个问题中的下一个 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;

它给出了这个结果:

所以通过结合这两条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' 中的参数不正确

我可以做些什么来修复错误?

以下答案的结果:

【问题讨论】:

    标签: mysql select


    【解决方案1】:

    您的 concat 中有一个“As Distance”,然后将 gorup concat 完成为“Shops”。

    我已经重写了您的查询。来自商店的 PREQUERY 计算您的距离并限制您输入 20 个条目......然后它加入到链的其余部分。由于“距离”是计算列,现在可以在您的 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
    

    【讨论】:

    • 哇,太棒了,谢谢。出于某种原因,我在结果中只得到了一行。预期的结果是我得到了数据库中的每个产品,看起来就像确实回来的那一行。大约有 16 种产品,所以 16 行就像回来的那一种。数据库中只有 2 家商店,这两家商店都在返回产品的结果中返回。所有产品都在两家商店中的一家或两家。我只需要弄清楚为什么其他产品没有在结果中返回。如果您知道为什么它只返回一行,请告诉我!
    • 我得到的结果贴在我的问题底部
    • @Beniamino_Baggins,添加了 GROUP BY。由于您的原始查询没有分组依据,因此它总是会通过 group_concat 返回一行。立即尝试。
    • 哦,对不起,我原来的查询一定有点错误。完毕。完美的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多