我有一个查询,我正在测试一个'IN'对抗一个选择。
我得到一个“操作数应该包含1列”错误,我认为是因为我在'IN'选择中选择了多于1列。我需要第二列作为选择器的一部分,因为我需要根据'having'语句检查它。
我如何才能使这项工作达到预期效果?
SELECT DISTINCT c.ID, Title, URLSegment
FROM ListingCategory c
LEFT JOIN SiteTree_Live ON c.ID = SiteTree_Live.ID
JOIN ListingCategory_Listings lc
ON c.ID = lc.ListingCategoryID
WHERE lc.ListingID IN (
SELECT Listing.ID,
( 6371 * ACOS( COS( RADIANS(-45.0227996) ) * COS( RADIANS( Location.Latitude ) ) * COS( RADIANS( Location.Longitude ) - RADIANS(168.6991149) ) + SIN( RADIANS(-45.0227996) ) * SIN( RADIANS( Location.Latitude ) ) ) ) AS distance
FROM Listing
LEFT JOIN Location ON Listing.LocationID = Location.ID
having distance < 5
);
答案 0 :(得分:1)
简单 - 只是不要选择计算列。此外,它应该是WHERE
,而不是HAVING
:
...
WHERE lc.ListingID IN (
SELECT Listing.ID
FROM Listing
LEFT JOIN Location ON Listing.LocationID = Location.ID
WHERE 6371 * ACOS( COS( RADIANS(-45.0227996) ) * COS( RADIANS( Location.Latitude ) ) * COS( RADIANS( Location.Longitude ) - RADIANS(168.6991149) ) + SIN( RADIANS(-45.0227996) ) * SIN( RADIANS( Location.Latitude ) ) )
< 5
);
答案 1 :(得分:0)
你想做什么是不可能完成的。 IN子查询必须返回单个列。
我的建议是将表LINSTING添加到连接链,然后询问Listing.ID is not null
。
另外:HAVING用于具有GROUP BY子句的查询。