mysql: использование динамического поля в запросе на совпадение

0

возникли проблемы с этим запросом:

        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, без везения.

как обойти это?

заранее спасибо

Теги:
full-text-search

2 ответа

0
Лучший ответ

Спасибо, Билл, ваш ответ был очень полезным и помог мне найти решение этой проблемы:

        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 непосредственно внутри подзапроса (поле полнотекстовое индексирование), а затем внесло математику (при наличии и порядке) после того, как все индексы совпадений вычислены раздельно.

Большое спасибо!

1

Здесь есть две вещи:

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

    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
    
  2. 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
    

Ещё вопросы

Сообщество Overcoder
Наверх
Меню