2009-10-26 43 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