我有一张用户和特征表。像这样:
| username1 |特质A |
| username2 |特质B |
| username2 |特质A |
有几百个特征。我想要做的是当用户输入表格中的任何特征时建议第二个特征。我想创建的是一个表,使用当前数据来确定任何具有特征A的人有可能还有特征B(或C或D ......)的概率所以该表最终会像这样:
|特质A |特质B | %probable |
|特质A |特质C | %probable |
例如,约翰喜欢苹果,我们知道喜欢苹果的人往往喜欢香蕉,所以我们建议约翰尝试香蕉。
答案 0 :(得分:1)
请尝试此sqlFiddle
SELECT t1.trait,t2.trait as trait2,count(t1.username)
/(SELECT COUNT(DISTINCT username) from users)
as probability
FROM users t1 JOIN users t2 USING (username)
WHERE t1.trait < t2.trait
GROUP BY t1.trait,t2.trait
如果你有400个特征,你最终会得到(400 choose 2 (79800))行。
更新:以上实际上是错误,因为它除以不考虑谁喜欢苹果的总人数。正确答案如下(sqlFiddle)
SELECT t1.trait,t2.trait as trait2,count(t1.username)
/(SELECT COUNT(DISTINCT username) from users WHERE trait = t1.trait)
as probability
FROM users t1 INNER JOIN users t2
ON t1.username = t2.username
WHERE t1.trait != t2.trait
GROUP BY t1.trait,t2.trait
注意COUNT(DISTINCT username) from users WHERE trait = t1.trait
和t1.trait != t2.trait
而不是t1.trait < t2.trait
,因为根据我们正在查看的特征,它会有所不同,例如,如果您有3个人喜欢香蕉,2个喜欢樱桃的话:那么我们可以说 100%喜欢香蕉这样的樱桃,但只喜欢 66.7 喜欢樱桃等香蕉的人。
所以现在如果你有400个特征,它实际上是400 x 399(159600)(之前认为的数字的两倍)可能的行返回。