#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. Хорошо, не волнуйтесь. Ваше первое решение работает! Похоже, проблема в моем расчете, я получаю ту же ошибку с моим старым запросом. Спасибо!