2017-06-01 89 views
0

所以我有这个疑问:SQL - 查询返回重复的记录,即使GROUP BY

SELECT P.*, 
    (3959 * acos(cos(radians('37.785834')) 
    * cos(radians(CA.lat)) 
    * cos(radians(CA.lng) 
    - radians('-122.406417')) 
    + sin(radians('37.785834')) 
    * sin(radians(CA.lat)))) AS distance 
FROM adp2_posts as P 
JOIN adp2_offer_details C ON C.merchant_id = P.ID 
JOIN adp2_addresses CA ON CA.address_id = C.address_id 
WHERE P.post_type = 'merchant' 
    AND P.post_status = 'publish' 
    AND CA.mm = "dallasftworth" 
    AND C.cats RLIKE CONCAT("[[:<:]]", REPLACE(199, ",", "[[:>:]]|[[:<:]]"), "[[:>:]]") 
GROUP BY CA.address_id, P.ID 
HAVING (distance < 999999999999999999 AND P.coupon_count > 0) ORDER BY distance ASC LIMIT 0 , 20 

我希望它从返回左表的独特价值,但它也返回重复。

结果:

the results

我有点被这个困惑。

+5

如果您按A,B分组,您会得到一行A,B的唯一组合 –

+0

您在查询中有'SELECT P. *',表示列中的列数多于图像中的列数。这可能很容易表明在MySQL中对“GROUP BY”的误用/误解。请从您的查询中发布更完整的结果集,并查看您希望查看结果的示例。不要将它们作为图像发布,像表格一样将它们复制/粘贴到代码编辑器中,突出显示和'ctl-k'或使用'{}'按钮就像代码块一样。 –

+0

有时候看到MySQL不会为这种查询抛出错误是非常令人沮丧的。 – Utsav

回答

0

对不起,没有提供完整的背景,它是一个漫长的一天,但我终于明白了。

这里结束查询:

SELECT P.*, MIN((3959 * acos(cos(radians('37.785834')) * cos(radians(CA.lat)) * cos(radians(CA.lng) - radians('-122.406417')) + sin(radians('37.785834')) * sin(radians(CA.lat))))) AS distance FROM adp2_posts as P JOIN adp2_offer_details C ON C.merchant_id = P.ID JOIN adp2_addresses CA ON CA.address_id = C.address_id WHERE P.post_type = 'merchant' AND P.post_status = 'publish' AND CA.mm = "dallasftworth" AND C.cats RLIKE CONCAT("[[:<:]]", REPLACE(199, ",", "[[:>:]]|[[:<:]]"), "[[:>:]]") GROUP BY P.ID HAVING (distance < 999999999999999999 AND P.coupon_count > 0) ORDER BY distance ASC LIMIT 0 , 20 

的问题是,CA.address_id地方不同,GROUP BY把它作为唯一的值。我所做的只是选择最小距离的P.*(这正是我的业务逻辑所要求的)。