2010-04-15 44 views
0

我的出路在這裏我的聯賽......MySQL的:使用匹配不精確值「ON」

我有一個映射表(表1)分配特定值(值)爲整數(map_nu) 。我的第二張表(table2)是每個用戶(user_id)的平均值(avg)的集合。

我無法弄清楚如何正確地做出降價表,請隨時編輯!

table1:   table2: 
(value)(Map_nu) (user_id)(avg) 
----    ----- 
1  1   1 1.111 
1.045 2  2 1.2 
1.09 3  3 1.33333 
1.135 4  4 1 
1.18 5  5 1.389 
1.225 6  6 1.42 
1.27 7  7 1.07 
1.315 8 
1.36 9 
1.405 10 

值Map_nu是每個用戶根據被分配一個特殊號碼的平均。我需要找到一種方法將table2中的平均值與table1中最接近的值進行匹配。我只需要匹配到2位過去小數點,所以我已經添加了截斷功能

SELECT table2.user_id, map_nu 
FROM `table1` 
JOIN table2 ON TRUNCATE(table1.value,2)=TRUNCATE(table2.avg,2) 

我依然想念那不完全匹配的平均數值。有沒有辦法選擇最接近的截斷值,或者甚至舍入到第二個小數?只要其適用於所有值相同,向上/向下舍入都不重要。

我想有以下結果(如果四捨五入):

(user_id)(Map_nu) 
---- 
1 4 
2 6 
3 6 
4 1 
5 10 
6 11 
7 3 

謝謝!

回答

0

這是一個尷尬的數據庫設計。什麼是數據表示和你想要解決什麼?可能有更好的方法。

+0

有我編輯出來的元素來簡化,但我想我已經簡化了。我會對這個問題進行一些編輯。讓我知道,如果這使得它更清晰。 – Brad 2010-04-16 00:01:21

+0

這對其他類型的貢獻者來說可能不公平,但是 - 這個問題來自一年前,而且我很久以前就已經開始動作了,很明顯,這個問題還不夠徹底,或者詢問正確的信息。選擇這個答案!謝謝:) – Brad 2012-07-31 05:04:39

1

我想你可能必須在2個單獨的查詢中做到這一點。在sql中沒有「最近的」操作符,因此您可以使用軟件計算它,也可以在循環中使用

select map_nu from table1 ORDER BY abs(value - $avg) LIMIT 1 

。但是,它不能用作連接函數,因爲它需要ORDER和LIMIT作爲連接無效。

看着它的另一種方式是,看起來你的map_nu和value是相互確定的 - value = 1 + ((map_nu - 1) * 0.045) - 所以也許你可以利用這個事實並根據這個方程計算一個整數?假設該關係適用於map_nu的所有值。

+0

不幸的是,這種關係在整個映射表中都不成立。我會做一些修改來澄清,如果您有任何其他想法,請告訴我。謝謝 – Brad 2010-04-16 00:02:11

+0

我認爲你唯一的選擇就是在一個循環內完成。 – oedo 2010-04-16 00:24:09

0

也許這樣做......

SELECT a.user_id, b.map_nu, abs(a.avg - b.value) 
FROM 
table2 a 
join table1 b 
left join table1 c on abs(a.avg - b.value) > abs(a.avg - c.value) 
where c.value is null 
order by a.user_id 

實際上並不產生輸出爲您所期望的(沒有做任何四捨五入)的一個相同。雖然你應該可以從那裏調整它。上面的查詢會產生以下(W /您所提供的數據)輸出:

user_id map_nu abs(a.avg - b.value) 
------- ------ -------------------- 
     1  3 0.0209999999999999 
     2  5     0.02 
     3  8    0.01833 
     4  1      0 
     5  10     0.016 
     6  10 0.0149999999999999 
     7  3     0.02 

要小心的是,如果你正在處理大表。評估上述查詢的解釋是否可以在MySQL中運行它,或者如果在它之外完成更好。

注2:如果有avg值是等距到value值範圍內table1會產生重複的行(例如果valuemap_nu的11和12是2和3,有人得到的2.5的avg)。 。你的問題沒有具體說明該怎麼做,所以你可能需要考慮這一點。

+0

我正在研究這個問題,同時考慮你的建議。但是 - 爲了將來的參考(我是股票溢出的新手) - 使用Markdown並製作如上所述的表格的快速方法是什麼? – Brad 2010-04-16 02:10:43

+0

我...呃,從sqlyog複製粘貼它並縮進它使它成爲代碼示例XD – 2010-04-16 03:17:01

0

其採取一些額外的工作,但我想,讓我的結果,最簡單的方法將是在表1到小數點後第二位的所有值映射:

1  1 
1.01 1 
1.02 1 
1.03 1 
1.04 1 
1.05 2 
1.06 2 
1.07 2 
1.08 2 
1.09 3 
1.1  3 
1.11 3 
1.12 3 
1.13 3 
1.14 4 
... 

感謝您的建議!對不起,我不能更清楚地提出這個問題。