получить сумму псевдонимов, созданных в SQL-запросе

#mysql #sql #sum #alias #relevance

#mysql #sql #сумма #псевдоним #Актуальность

Вопрос:

У меня есть более крупный SQL-запрос, в котором я использую Boolean Full-Text Searches для получения relevance values .

Я получаю два значения релевантности:

  • один для тегов (scoreTags), умноженный на 3 (более высокая важность)
  • один для содержимого (scoreContent)

Оба присваиваются aliasses . Теперь я хочу добавить их для каждого совпадения в новом псевдониме (SuperScore) в том же SQL-запросе, но, похоже, псевдонимы не могут быть использованы 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 имеет значение релевантности (scoreTags) 5 и значение релевантности 4 (scoreContent). Этот высший балл должен быть 19 ((5 * 3) 4).

Комментарии:

1. Вам нужно либо использовать подзапросы , либо повторить выражения в select .

Ответ №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
  

Комментарии:

1. Большое вам спасибо за ваш ответ. Ваше первое решение работает, но теперь вычисление scoreTags неверно. Второе решение не работает, я получаю следующую ошибку SQL: mysqlt error: [1248: Every derived table must have its own alias] . И я исправил имеющиеся у вас опечатки, поэтому это не может быть источником. Я попробую исправить ваше первое решение самостоятельно, но если вы увидите что-нибудь, что может помочь, не стесняйтесь, дайте мне знать .. 😉 Спасибо!

2. Хорошо, не волнуйтесь. Ваше первое решение работает! Похоже, проблема в моем расчете, я получаю ту же ошибку с моим старым запросом. Спасибо!