【问题标题】:get sum of aliases created in SQL query获取在 SQL 查询中创建的别名的总和
【发布时间】:2014-08-22 02:29:17
【问题描述】:

我有一个更大的 SQL 查询,我使用 Boolean Full-Text Searches 来获取 relevance values

我得到两个相关值:

  • 标签 (scoreTags) 乘以 3(重要性更高)
  • 一个用于内容(scoreContent)

两者都分配给aliasses。现在我想在同一个 SQL 查询中为新别名(superScore)中的每个匹配项添加它们,但似乎 sql 不能使用别名来计算它。

(scoreTags + scoreContent) AS superScore

我收到以下错误:

mysqlt error: [1054: Unknown column 'scoreTags' in 'field list']

这是我完整的 SQL 语句:

SELECT csia.cID, csia.ak_tags, p.cParentID, cv.cvName, 
(MATCH (csia.ak_tags) AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE) * 3) AS scoreTags, 
MATCH (psi.content) AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE) AS scoreContent,        
(scoreTags + scoreContent) AS superScore 
FROM CollectionSearchIndexAttributes csia 
LEFT JOIN Pages p 
ON csia.cID = p.cID 
LEFT JOIN CollectionVersions cv 
ON csia.cID = cv.cID 
LEFT JOIN PageSearchIndex psi 
ON csia.cID = psi.cID 
WHERE cv.cvIsApproved = 1 
AND (MATCH (csia.ak_tags) AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE)) 
ORDER BY scoreContent DESC, scoreTags DESC, csia.cID DESC

我也尝试了SUM 功能,但也没有用。你知道如何让它工作吗?谢谢!

我想要的示例:

与 cID 9932 匹配的查询具有 5 的相关性值 (scoreTags) 和 4 (scoreContent) 的相关性值。这个 superScore 应该是 19 ((5 * 3) + 4)。

【问题讨论】:

  • 您需要使用子查询或重复select中的表达式。

标签: mysql sql sum alias relevance


【解决方案1】:

您可以将别名替换为实际函数,或者将此语句放入派生表中,然后从中进行聚合。

所以第一个是:

SELECT csia.cID, 
       csia.ak_tags, 
       p.cParentID, cv.cvName, 
       (MATCH (csia.ak_tags) 
        AGAINST ('Bestäubung Bienen Politik' 
        IN BOOLEAN MODE) * 3) AS scoreTags, 
       MATCH (psi.content) 
       AGAINST ('Bestäubung Bienen Politik' 
       IN BOOLEAN MODE) AS scoreContent,        
       (MATCH (csia.ak_tags) 
       AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE) * 3) 
       + 
       MATCH (psi.content) 
       AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE) AS SUperScore        
FROM   CollectionSearchIndexAttributes csia 
LEFT JOIN Pages p 
ON csia.cID = p.cID 
LEFT JOIN CollectionVersions cv 
ON csia.cID = cv.cID 
LEFT JOIN PageSearchIndex psi 
ON csia.cID = psi.cID 
WHERE cv.cvIsApproved = 1 
AND (MATCH (csia.ak_tags) AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE)) 
ORDER BY scoreContent DESC, scoreTags DESC, csia.cID DESC

或者第二个:

select cID, 
       ak_tags, 
       cParentID, 
       cvName, 
       scoreTags, 
       scoreContent, 
       scoreTags+ScoreContent as SuperScore from (
            SELECT csia.cID, csia.ak_tags, p.cParentID, cv.cvName, 
            (MATCH (csia.ak_tags) 
            AGAINST ('Bestäubung Bienen Politik' 
            IN BOOLEAN MODE) * 3) AS scoreTags, 
            MATCH (psi.content) 
            AGAINST ('Bestäubung Bienen Politik' 
            IN BOOLEAN MODE) AS scoreContent
      FROM CollectionSearchIndexAttributes csia 
      LEFT JOIN Pages p 
      ON csia.cID = p.cID 
      LEFT JOIN CollectionVersions cv 
      ON csia.cID = cv.cID 
      LEFT JOIN PageSearchIndex psi 
      ON csia.cID = psi.cID 
      WHERE cv.cvIsApproved = 1 
      AND (MATCH (csia.ak_tags) AGAINST ('Bestäubung Bienen Politik' IN BOOLEAN MODE))
 ) x
 ORDER BY scoreContent DESC, scoreTags DESC, csia.cID DESC

【讨论】:

  • 非常感谢您的回答。您的第一个解决方案有效,但现在scoreTags 的计算是错误的。第二种解决方案不起作用,我收到以下 SQL 错误:mysqlt error: [1248: Every derived table must have its own alias]。我纠正了你的错别字,所以这不能是来源。我会尝试自己解决您的第一个解决方案,但如果您发现任何可能有帮助的信息,请随时告诉我.. ;) 谢谢!
  • 好的,别担心。您的第一个解决方案有效!我的计算似乎是问题所在,我的旧查询出现了同样的错误。谢谢!
猜你喜欢
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2011-10-28
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多