基于Mysql百分比的查询

时间:2011-07-03 23:00:21

标签: php 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."");

2 个答案:

答案 0 :(得分: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会更漂亮。

答案 1 :(得分:0)

怀疑这可以在一个声明中正确完成。我个人会:

  1. 计算每种车型的COUNT(),在查询中一起抓取它们。
  2. 使用子查询分别检索两种车型,LIMIT根据所需百分比设置为正确的金额和偏移量(因此,如果您想要20个结果,从40开始,宝马如果是40%,那么限制将是从16开始的8个结果 - 它们需要是整数值)
  3. 使用UNION合并结果,ORDER BY RAND()将它们混合在一起。
  4. 这只是两个实际查询,一个用于计数,一个用于结果的组合查询,如果性能是一个很大的问题,您可以将它们组合在一个存储过程中。

    您可以使用结果中的语句prepare / execute来组合它们 - 查看this method from a possible duplicate question