2011-07-03 65 views
3

这种mysql查询可能吗?基于Mysql百分比的查询

SELECT power 
    FROM ".$table." 
    WHERE category IN ('convertible') 
    AND type = bwm40% 
    AND type = audi60% 
ORDER BY RAND() 

会去是这样的:从所有的汽车,选择可转换的那些的力量,但选择的40%将是宝马的另60%的奥迪。

这可以用mysql来完成吗?

似乎无法使其与IDEEA波纹管工作,给我一个错误,这里是我试了一下:

$result = mysql_query(" 
SELECT power, torque FROM ".$table." 
WHERE category IN ('convertible') 
ORDER BY (case type when 'bmw' then 0.4 when 'audi' then 0.6) * RAND() DESC 
LIMIT ".$offset.", ".$rowsperpage.""); 
+0

发布您的实际表结构,有人可以提供帮助。 – NotMe

+0

如果您正在进行分页,则'ORDER BY RAND()'无变化,因为每次运行查询以获取下一页时,RAND()的值都会有所不同。 –

+0

可能重复:[?MySQL的 - 通过百分比限制(http://stackoverflow.com/questions/1309137/mysql-limit-by-percentage) – Orbling

回答

2

你可以尝试使用CASE调整的随机性:

SELECT power 
FROM table 
WHERE category IN ('convertible') 
    AND type IN ('bwm', 'audi') 
ORDER BY (case type when 'bwm' then Wbwm when 'audi' then Waudi) * RAND() DESC 

WbmwWaudi是加权因子。然后,您将添加一个LIMIT子句,以便按照您所需的大小截断结果。这不会保证你想要的比例,但它可能足够你的目的。

你想用上面的加权因子(WbmwWaudi)来玩一下你想要的结果。权重因子取决于数据库中的bwmaudi的频率,例如0.2和0.8可能会更好。正如克里斯在评论中指出的那样,如果宝马和奥迪之间的比例为50/50,则0.4和0.6才有效。将权重放在一个单独的表中会使这种方法更容易维护,而且SQL会更漂亮。

+0

泰TY,很interestin。我试图给一些比例,因为有时候我的数据库中的宝马数量比audis多得多,我只想在网站上公平地出现...... – webmasters

+0

@webmasters:听起来就像你只是想混合一些东西而不是实现精确的60/40分割(根据数据库中的bmw/audi分布,这可能甚至不可能)。使用简单的权重来摆弄分布是一种相当常见的技术。你也可以把你的权重放在一个单独的表格中,以获得更好的灵活性并避免一个丑陋的内联CASE。 –

+0

-1,除非数据库中audis和bmws的比例为50-50,否则这不起作用。我错了吗? –

0

疑问,这可以在一个语句得当。我个人会:

  1. 计算每种车型的COUNT(),在查询中一起抓住它们。
  2. 检索两种汽车类型分别使用子查询与LIMIT设置为正确的金额,并根据想要的(所以如果你想20个结果总,起始于40,和宝马,如果40%的比例失调,则限制将是8个结果,从16 - 他们需要的是整数值)
  3. 使用UNION的结果ORDER BY RAND()结合起来,将它们混合在一起。

这只是两个实际的查询,一个用于计数,对结果一个组合查询,你可以将它们组合在存储过程中如果性能是一个问题了这一点。

你可以使用如下语句准备/从结果执行结合他们 - 看看this method from a possible duplicate question