2009-10-26 41 views
0

我有一個名爲'user_car'的字段。它由一個cat'd下劃線分隔值(用戶的ID _汽車的ID)在WHERE語句中的REGEXP?

user_car   rating 
----------------------------- 
11_56748   4 
13_23939   2 
1_56748   1 
2001_56748   5 
163_23939   1 

我需要得到的平均得分爲任何「汽車」。在我的示例表中,列出的車輛只有2輛:56748和23939.所以說我想獲得汽車的平均評級:56748,到目前爲止我有這個SQL,但我需要正確的正則表達式。如果我完全脫離基地,請告訴我。謝謝!

$sql = " 
    SELECT AVG 'rating' FROM 'car_ratings' 
    WHERE 'user_car' REGEXP ''; 
"; 
+6

這是一個糟糕的主意_。將user_car分解爲user_id和car_id會更好。 – 2009-10-26 18:46:07

+2

同意。有時候我們必須處理我們提供的數據結構。這個過程的所有部分。 – k00k 2009-10-26 18:51:35

回答

3

我不明白爲什麼你需要使用正則表達式...

SELECT AVG(`rating`) FROM `car_ratings` WHERE `user_car` LIKE '%_56748' 

的正則表達式是緩慢的,可以很容易地拍你的腳。我儘可能地學會了在MySQL中避免使用它們。

+1

「LIKE」+1。請記住,你可能會因爲對正則表達式的負面評論而被投票否決(儘管它們可能是真的):-)另外,不應該將'AVG'參數放在括號中嗎? – ChssPly76 2009-10-26 18:48:40

+0

AVG在括號中:當你從問題中複製東西時會發生這種情況:) – ty812 2009-10-26 18:50:10

+1

實際上,在這種情況下,LIKE可能不會明顯比RLIKE/REGEXP快,因爲它不能對其進行優化。但是,它肯定還是一個優點,因爲LIKE符合ANSI SQL;正則表達式是MySQL特有的。另外,正則表達式是一堆便便。 ;-) – bobince 2009-10-26 19:06:52

5

可以使用提取到車輛ID:

substring(user_car from (locate('_', user_car) + 1)) 

這將允許你這樣做:

select substring(user_car from (locate('_', user_car) + 1)) as car_id, 
     avg(rating) 
from  car_ratings 
group by car_id 

但是,這是一個壞主意。將user_car劃分爲user_idcar_id會更好。

+0

你怎麼知道他使用PHP來訪問數據庫? – ty812 2009-10-26 18:53:09

+0

我不知道;我有沒有說PHP? – 2009-10-26 18:54:59

+0

需要更多的睡眠,我的錯,對不起-_- – ty812 2009-10-26 19:00:33