2016-02-05 44 views
0

在MySQL中,是否有任何聚合函數(或任何其他方法)找到最接近特定值的值?MySQL聚合函數找到最接近的值

例如,我在尋找地址,其中門牌號碼是15。或者,在一些街道沒有房子沒有15,最接近的門牌號碼(如14或16)應返回:

SELECT closest(house_no, 15), street_name 
FROM addresses 
GROUP BY street_name 

由於需要彙總,因此我無法從ORDER BY ABS(house_no - 15) LIMIT 1中看到任何可用於獲得單一結果的幫助。

+0

不,沒有「最接近」的功能,所以'按abs()'命令排序就是你所能做的。最糟糕的情況是,您可以使用子查詢來計算'house_no -15'內容,然後在父查詢中進行分組/過濾。 –

+0

對不起,ABS方法有什麼問題?爲什麼需要彙總? – Strawberry

+0

@Strawberry我需要彙總,因爲我需要所有街道的結果。或者,我可以在PHP中進行後處理(無論如何,我的工作流程中都會涉及其他一些處理)。 – user1702401

回答

2
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(street VARCHAR(12) NOT NULL 
,house_no INT NOT NULL 
,PRIMARY KEY(street,house_no) 
); 


INSERT INTO my_table VALUES 
('street_1',11), 
('street_1',12), 
('street_1',13), 
('street_1',14), 
('street_2',12), 
('street_2',13), 
('street_2',14), 
('street_2',15), 
('street_3',13), 
('street_3',14), 
('street_3',16), 
('street_4',16), 
('street_4',17), 
('street_4',18), 
('street_4',19); 

SELECT x.* 
    FROM my_table x 
    JOIN 
    (SELECT street, MIN(ABS(house_no-15)) best_match FROM my_table GROUP BY street) y 
    ON y.street = x.street 
    AND y.best_match = ABS(x.house_no-15); 
+----------+----------+ 
| street | house_no | 
+----------+----------+ 
| street_1 |  14 | 
| street_2 |  15 | 
| street_3 |  14 | 
| street_3 |  16 | 
| street_4 |  16 | 
+----------+----------+ 
+0

現在很整潔!謝謝! – user1702401