Php MySql按分数描述选择-当有多个分数合计时。。。。古怪的

Php MySql按分数描述选择-当有多个分数合计时。。。。古怪的,php,mysql,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分)非常有效,但现在我有一

好的,我有一张满是客户“推荐书”的桌子。有些是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分),我需要设计一种新的方法将这些推荐信也拿出来,并将它们放在组合中


到目前为止,我已经删除了score>8子句,并在脚本中添加了一个SWITCH limit子句,以删除添加一个列,该列的值为额定值max,下面称为max_score。所以在你的情况下,要么是5,要么是10。然后使用百分比进行标准化:

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

简单。

根据
源代码
就地规范化如何?这样您就不必再添加其他字段:

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


这假设
source
可以是1或2。

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

SELECT * from testimonials WHERE score > 8 OR (source = 'source2' AND score > 3) ORDER BY rand()

正如您的开关说明所示,这将为source1选择大于8的分数,为source2选择大于3的分数。

您需要按来源分开。无论是内联的还是已知的源

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()

只是一个建议,为什么不使用百分比,来源1的东西,除以10得到百分比,来源2的东西,除以5得到百分比,然后你将两者都用百分比表示,你可以将其视为相同的。使用来源和分数得到一个百分比列,然后用它进行排序和随机化。如果源为1个百分比=10/分数,否则百分比=5/分数。若要随机化结果,可以使用ORDER BY uuid()。顺便说一句-ORDER BY rand()-rand()是问题所在,将随着源数据的增长而表现得非常糟糕。取而代之的是一个伪随机排序器来排序,因为我猜你只是不想让它看起来每次都出现同样的证明。如果你有一个主键,你可以添加一个随机整数,然后模和顺序应该很好。简单!回答得很好,做了需要的事。