我试图将两个工作的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语句的结果如下所示:
重要提示:我已经在商店表中添加了纬度和经度字段,这对于此问题中的下一个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'
时参数不正确
我该怎么做才能解决错误?
以下答案的结果:
答案 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