баг having + full text

berkut

Новичок
баг having + full text

вообщем так:
Код:
CREATE TABLE `kw_names` (
  `id` MEDIUMINT(9) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(100) COLLATE utf8_general_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name_unique` (`name`),
  FULLTEXT KEY `ft_name` (`name`)
)ENGINE=MyISAM AUTO_INCREMENT=1952 CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

SELECT GROUP_CONCAT(DISTINCT kn.name SEPARATOR " ") AS st
FROM kw_names AS kn
WHERE MATCH (kn.name) AGAINST ("festival" IN BOOLEAN MODE)
GROUP BY kn.id
HAVING MATCH(st) AGAINST('festival' IN BOOLEAN MODE);
вот это муську на винде совсем убивает, а на linux просто отваливается соединение. тестировал на 5.0.32, 5.0.45 и на той, что сейчас последняя rc в 5.1 - но на этой у меня каждый второй запрос её убивает
или баг или я чего-то не догоняю
 

Gas

может по одной?
а зачем fulltext в having, имхо его лучше заменить на LOCATE('festival', st);

если 'festival' не подстрока kn.name, а равно ему, то можно ещё лучше сделать.
 

berkut

Новичок
ну это сильно упрощенный запрос, который вообще не имеет смысла с PRIMARY KEY (`id`) + GROUP_CONCAT(DISTINCT kn.name SEPARATOR " ") + GROUP BY kn.id.
у меня на входе произвольная строка: "hamburg cool festival".
на каждый объект несколько строк с ключевыми словами. мне нужно выбрать объекты, с которыми связано более например 3 слов из запроса
HAVING MATCH(st) AGAINST("hamburg cool festival" IN BOOLEAN MODE) >= 3
я как-то больше выхода не вижу.
т.е. у меня связи object->keyword - один ко многим
 

Gas

может по одной?
тогда разве такой вариант по подходит ?
[sql]
select id_obj
from `tbl`
where `name` in ('word1','word2')
group by id_obj
having count(*) >= N
[/sql]
или в name не отдельные слова, а несколько слов может быть?
 

berkut

Новичок
Gas
в name может быть несколько слов. а ещё фишка в возможном наличии дубликатов, в том числе и из-за нескольких слов в name(как правило не более 2-х). вот мой мегакорявый запрос, который работает чуток не правильно из-за того, что в name могут быть несколько слов:
Код:
SELECT SQL_CALC_FOUND_ROWS *
FROM ((
    SELECT i.*,
           i.associations AS associations_count,
           SUM(MATCH (kn.name) AGAINST ("hamburg cool festival" IN BOOLEAN MODE))
            AS matched_words_count,
           SUM(1 / ka.flags * ka.editors_associations_count) AS
            calculated_relevancy
    FROM items AS i
         INNER JOIN keywords_associations AS ka ON i.id = ka.item_id
         LEFT JOIN keywords_synonyms AS ks ON ks.kw_id = ka.kw_id
         INNER JOIN keywords_names AS kn ON (kn.id = ks.synonym_id)
    WHERE MATCH (kn.name) AGAINST ("hamburg cool festival" IN BOOLEAN MODE)
    GROUP BY ka.item_id
         )
    UNION (
    SELECT i.*,
           i.associations AS associations_count,
           SUM(MATCH (kn.name) AGAINST ("hamburg cool festival" IN BOOLEAN MODE))
            AS matched_words_count,
           SUM(1 / ka.flags * ka.editors_associations_count) AS
            calculated_relevancy
    FROM items AS i
         INNER JOIN keywords_associations AS ka ON i.id = ka.item_id
         INNER JOIN keywords_names AS kn ON (kn.id = ka.kw_id)
    WHERE MATCH (kn.name) AGAINST ("hamburg cool festival" IN BOOLEAN MODE)
    GROUP BY ka.item_id
      )) AS t
GROUP BY id
HAVING matched_words_count >= 3/*это считаю в ручную кол-во слов на входе*/
ORDER BY calculated_relevancy DESC
LIMIT 0, 10
собственно это кривой вариант, того что нужно делать как ты предложил выше HAVING COUNT(*)
что решает моё проблему:
Код:
SELECT SQL_CALC_FOUND_ROWS *
    , GROUP_CONCAT(DISTINCT matched_words SEARATOR " ") AS matched
FROM ((
    SELECT i.*,
           i.associations AS associations_count,
           GROUP_CONCAT(DISTINCT kn.name SEPARATOR " ")
            AS matched_words,
           SUM(1 / ka.flags * ka.associations_count) AS
            calculated_relevancy
    FROM items AS i
         INNER JOIN keywords_associations AS ka ON i.id = ka.item_id
         LEFT JOIN keywords_synonyms AS ks ON ks.kw_id = ka.kw_id
         INNER JOIN keywords_names AS kn ON (kn.id = ks.synonym_id)
    WHERE MATCH (kn.name) AGAINST ("hamburg cool festival" IN BOOLEAN MODE)
    GROUP BY ka.item_id
         )
    UNION (
    SELECT i.*,
           i.associations AS associations_count,
           GROUP_CONCAT(DISTINCT kn.name SEPARATOR " ")
            AS matched_words,
           SUM(1 / ka.flags * ka.associations_count) AS
            calculated_relevancy
    FROM items AS i
         INNER JOIN keywords_associations AS ka ON i.id = ka.item_id
         INNER JOIN keywords_names AS kn ON (kn.id = ka.kw_id)
    WHERE MATCH (kn.name) AGAINST ("hamburg cool festival" IN BOOLEAN MODE)
    GROUP BY ka.item_id
      )) AS t
GROUP BY id
HAVING MATCH(matched) AGAINST("hamburg cool festival" IN BOOLEAN MODE) >= 3
ORDER BY calculated_relevancy DESC
LIMIT 0, 10
но я чёто пока писал, начал сомневаться

-~{}~ 15.05.08 22:42:

походу я как-то через попу гланды выдираю
 
Сверху