MySql按分数desc选择 - 当有多个分数总数时...... ODD

时间:2017-08-30 22:53:52

标签: php mysql

好的,所以我有一张桌子上写满了客户“推荐书”。有些标记为10,其他标记为5(它们来自不同来源)

我的表格包含以下字段:

id (int 4 ) AI Pri Index
headline varchar 255
content text
source varchar 55
score double

所以我的问题是:

SELECT * from testimonials WHERE score > 8 ORDER BY rand()

这完全适合我的10个评分中的主要证言,但是现在我有一个标记为5的新组合,我需要设计一种新的方法来将它们拉出来并将它们混合在一起。

到目前为止,我已删除了分数> 8子句,并在我的脚本中添加了一个SWITCH限制子句,以删除< 8 for source 1,< 3为source2。

这些现在按DESC的顺序显示,但我希望整个批次是随机的,或者至少在结果中将source1和source2混合在一起。

我更愿意在查询中执行所有这些操作... 有什么想法吗?

4 个答案:

答案 0 :(得分:4)

添加一个值为max max的列 - 下面称为max_score。所以在你的情况下它是5或10.然后使用百分比进行标准化:

 SELECT * from testimonials WHERE (score/max_score) > 0.8 ORDER BY rand()

易。

答案 1 :(得分:1)

如何根据source在现场进行规范化?然后你不必添加另一个字段:

SELECT source, score FROM testimonial WHERE (score/IF(source='1',10,5)) >= .8;

Fiddle

这假设source可以是1或2。

答案 2 :(得分:1)

您只需在工作查询中添加一个简单的OR条件:

vadu=get_unique_values(3Darray)

这选择分数> 8为source1和>如您的SWITCH解释建议的那样,对于source2有3个。

答案 3 :(得分:0)

您需要按来源分开。内联已知来源

SELECT score, 
CASE source
   WHEN 1 THEN 10
   WHEN 2 THEN 5 ...
END CASE as max_score
FROM testimonials
WHERE (score/max_score*10) > 8
ORDER BY rand()

或者创建一个源表并加入它们

SELECT t.score, 
s.max_score
FROM testimonials t
LEFT JOIN source_table s
  ON s.source=t.source
WHERE (t.score/s.max_score*10) > 8
ORDER BY rand()