Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多重连接中的Score算法_Mysql_Join_Count - Fatal编程技术网

Mysql 多重连接中的Score算法

Mysql 多重连接中的Score算法,mysql,join,count,Mysql,Join,Count,我有一个出版物列表存储在publications表中。每个出版物都与类别有多对多关系,也与关键字有多对多关系 给定一份出版物,我希望根据使用以下算法计算的分值查找相关出版物: 与其他出版物共享的每个类别都算作一分 与其他出版物共享的每个关键字都算作一个点 分数值是使用前面步骤计算的分数之和 我想通过一次查询检索按此分数排序的相关出版物列表 现在我有两个查询,它们计算类别和关键字的分数 SELECT c.publication_id, (COUNT(c.category_id)) AS csc

我有一个出版物列表存储在publications表中。每个
出版物
都与
类别
有多对多关系,也与
关键字
有多对多关系

给定一份出版物,我希望根据使用以下算法计算的分值查找相关出版物:

  • 与其他出版物共享的每个类别都算作一分
  • 与其他出版物共享的每个关键字都算作一个点
  • 分数值是使用前面步骤计算的分数之和
我想通过一次查询检索按此分数排序的相关出版物列表

现在我有两个查询,它们计算类别和关键字的分数

SELECT c.publication_id, (COUNT(c.category_id)) AS cscore
FROM cat_pub c
WHERE c.category_id IN <list of category ids obtained from the current publication>
GROUP BY c.publication_id
ORDER BY cscore DESC
解释告诉我将使用两个临时表。这可能是性能问题吗?有没有更好的方法来实现这一点

更新 应允

你的解决方案是错误的。在子查询中使用LIMIT子句可能会导致结果与LIMIT的每个值不一致。如果我对子查询有以下结果(我将显示11条记录,但您的查询将只获取前10条记录),该怎么办

如果我有10条记录,其中100条为
cscore
和10条不同的记录,其中100条为
kscore
,则联接将生成一个空集。所以我没有得到任何结果,而id为1000的发布应该是解决方案,它被从结果集中忽略

此外,我可以考虑用左边的连接来解决这个问题,在这种情况下,只从左表中获取记录,并且每个记录将得到100的总得分(因为空的第二个表中的空<代码> kSqs< /Cord>字段给出的空值)。同样,结果是错误的,因为得分最高的记录应该是p1000,总分为198(=99+99)


您的解决方案无法生成可靠的结果。

您只希望子查询中的每个结果有5个。
我认为最好只从中选择5,并在查询中使用它

将q1改写为:

SELECT c.publication_id, COUNT(*) AS cscore
FROM cat_pub c
WHERE c.publication_id = p.id  
AND c.category_id IN <list of category ids obtained from the current publication>
GROUP BY c.publication_id
ORDER BY cscore DESC
LIMIT 10
选择c.publication\u id,计数(*)作为cscore
来自c类
其中c.publication_id=p.id
和c.category_id在中
按c.publication\u id分组
cscore DESC订购
限制10
将q2改写为:

SELECT k.publication_id, COUNT(*) AS kscore
FROM key_pub k
WHERE p.id = k.publication_id
  AND k.keyword IN <list of category ids obtained from the current publication>
GROUP BY k.publication_id
ORDER BY kscore DESC
LIMIT 10
选择k.publication\u id,COUNT(*)作为kscore
来自基尤酒店
其中p.id=k.publication\u id
和k.IN
按k.U.id分组
由kscore DESC订购
限制10
使联接保持原样:

SELECT p.*, (q1.cscore + q2.kscore) AS score
FROM publications p
INNER JOIN (<cscore query>) q1 ON p.id = q1.publication_id
INNER JOIN (<kscore query>) q2 ON p.id = q2.publication_id
ORDER BY score DESC
LIMIT 5
选择p.*(q1.cscore+q2.kscore)作为分数
摘自出版物p
p.id=q1.id上的内部联接()q1
p.id=q2.id上的内部联接()q2
按分数顺序描述
限制5

请注意,计数(*)通常是一个更快的选择,因为它不会测试
null
,如果您可以有
null
值,并且不想在计数中包含这些值,那么就显式地命名计数(字段)。

无法理解为什么会被否决……我想要得分最高的5个条目,其中得分是
cscore+kscore
,因此,我无法应用您的查询,因为它们可能导致错误的结果。顺便说一句,
COUNT(*)
提示+1。我已更新了我的问题,以回答您的最新评论。
SELECT c.publication_id, COUNT(*) AS cscore
FROM cat_pub c
WHERE c.publication_id = p.id  
AND c.category_id IN <list of category ids obtained from the current publication>
GROUP BY c.publication_id
ORDER BY cscore DESC
LIMIT 10
SELECT k.publication_id, COUNT(*) AS kscore
FROM key_pub k
WHERE p.id = k.publication_id
  AND k.keyword IN <list of category ids obtained from the current publication>
GROUP BY k.publication_id
ORDER BY kscore DESC
LIMIT 10
SELECT p.*, (q1.cscore + q2.kscore) AS score
FROM publications p
INNER JOIN (<cscore query>) q1 ON p.id = q1.publication_id
INNER JOIN (<kscore query>) q2 ON p.id = q2.publication_id
ORDER BY score DESC
LIMIT 5