возникли проблемы с этим запросом:
SELECT contests.*,
(
SELECT Count(*)
FROM participants
WHERE participants.contest_id = contests.id
AND participants.active = 1
AND participants.deleted = 0) AS cur_participants,
(
SELECT path
FROM media
WHERE media.entity_type = 'contests'
AND media.entity_id = contests.id
AND deleted = 0
AND type = 'img'
AND is_primary = 1) AS thumbnail,
(
SELECT description
FROM (
SELECT contest_id,
description,
deleted
FROM rewards_assets
UNION
SELECT contest_id,
description,
deleted
FROM rewards_cars
UNION
SELECT contest_id,
description,
deleted
FROM rewards_houses) AS rewards
WHERE rewards.contest_id = contests.id
AND rewards.deleted = 0) AS **reward**
, (match (name) AGAINST ('car') + match (description) AGAINST ('car') + match (**reward**) AGAINST ('car')) AS rel
FROM contests
WHERE active = 1 AND deleted = 0 AND end_date > UNIX_TIMESTAMP()
HAVING rel > 0
ORDER BY rel DESC
LIMIT 0, 201
Это возвращает:
#1054 - Unknown column 'reward' in 'field list'
enter code here
Кажется, что функция совпадения не может работать с полем награды, созданным с помощью "AS". Я попытался переместить эту часть соответствия непосредственно в предложение where и order by clause без naimg it rel
в SELECT, без везения.
как обойти это?
заранее спасибо
Спасибо, Билл, ваш ответ был очень полезным и помог мне найти решение этой проблемы:
SELECT contests.*,
(
SELECT Count(*)
FROM participants
WHERE participants.contest_id = contests.id
AND participants.active = 1
AND participants.deleted = 0) AS cur_participants,
(
SELECT path
FROM media
WHERE media.entity_type = 'contests'
AND media.entity_id = contests.id
AND deleted = 0
AND type = 'img'
AND is_primary = 1) AS thumbnail
, (match (name) AGAINST ('car') + match (description) AGAINST ('car')) AS contest_rel, (
SELECT reward_rel
FROM (
SELECT contest_id,
match(description) AGAINST('car') AS reward_rel,
deleted
FROM rewards_assets
UNION
SELECT contest_id,
match(description) AGAINST('car') AS reward_rel,
deleted
FROM rewards_cars
UNION
SELECT contest_id,
match(description) AGAINST('car') AS reward_rel,
deleted
FROM rewards_houses) AS rewards
WHERE rewards.contest_id = contests.id
AND rewards.deleted = 0) AS reward_rel
FROM contests
WHERE active = 1 AND deleted = 0 AND end_date > UNIX_TIMESTAMP()
HAVING (contest_rel+reward_rel) > 0
ORDER BY (contest_rel+reward_rel) DESC
LIMIT 0, 20
Я выбрал вознаграждения rel непосредственно внутри подзапроса (поле полнотекстовое индексирование), а затем внесло математику (при наличии и порядке) после того, как все индексы совпадений вычислены раздельно.
Большое спасибо!
Здесь есть две вещи:
Вы не можете ссылаться на псевдоним в другом выражении в списке выбора.
SELECT 123 AS x, x+1 AS y -- WRONG
SELECT 123 AS x ... WHERE x = 123 -- WRONG
Обходным путем является определение определения псевдонима в производной таблице.
SELECT x, x+1 AS y FROM (SELECT 123 AS x) AS t
MATCH()
работает только с реальными столбцами, для которых был определен индекс FULLTEXT. Вы не можете ссылаться на какой-либо псевдоним или производный столбец в MATCH(). Таким образом, обходной путь выше не будет работать.
CREATE TABLE MyTable ( t TEXT, FULLTEXT INDEX(t));
SELECT MATCH(t2) AGAINST ('...') FROM (SELECT t AS t2 FROM MyTable) AS d;
ERROR 1191 (HY000): Can't find FULLTEXT index matching the column list