Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос / 14 сообщений из 14, страница 1 из 1
24.03.2015, 13:09:00
    #38914874
sniffysko1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Задача такова: нужно выполнить полнотекстовый поиск по полям, которые разбросаны по куче таблиц. Я, значит объединяю их в одну таблицу и пытаюсь в ней искать. Но тут я достиг пределов своих познаний в MySQL.
Он выдает ошибку: #1214 - The used table type doesn't support FULLTEXT indexes.
Запрос:
------------------
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SELECT name, street_name, number, phone
FROM(
		SELECT
			ci.id, ci.name, cs.name AS street_name, ci.number, ci.phone, ci.work_time,
			cn.name AS n_name, cn.number AS n_number, cn.phone AS n_phone, cn.work_time AS n_work_time, csn.name AS n_street_name,
			ct.name as tag
		FROM cat_item AS ci
		LEFT JOIN cat_street AS cs ON cs.id = ci.street
		JOIN cat_network AS cn ON cn.parent_id = ci.id
		LEFT JOIN cat_street AS csn ON csn.id = cn.street
		JOIN cat_item_tag AS cit ON cit.item_id = ci.id
		JOIN cat_tag AS ct ON ct.id = cit.tag_id
		WHERE visible = 'Y'
	) AS joined_tbl
WHERE
	MATCH(
		name, street_name, number, phone, work_time,
		n_name, n_number, n_phone, n_work_time, street_name,
		tag
	)
	AGAINST('искомое_слово')
GROUP BY ci.id
LIMIT 0, 50


-------------------
Не могу понять на что он ругается. Либо на то, что созданная таблица joined_tbl не MyISAM, либо входящие в ее состав таблицы не MyISAM. При этом, проверил, и таблицы, по полям которых производится полнотекстовый поиск имеют тип MyISAM.
Внутренняя таблица собирается нормально. Проблемы начинаются уже после того, как в ней начинается поиск.
В любом случае, подскажите, что с этим делом делать. Может я выбрал не лучший вариант поиска.
...
Рейтинг: 0 / 0
24.03.2015, 14:04:39
    #38914971
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
что такое 'искомое_слово'
в твоём понимании?
а лучше более конкретно - что на входе, и что требуется получить
это к тому, что по приведённому запросу FULLTEXT нафик не нужен
...
Рейтинг: 0 / 0
24.03.2015, 14:35:56
    #38915020
sniffysko1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Сам запрос пишется для поиска по базе.
искомое_слово -- это то, что я буду искать. То, что пользователь введет в форме поиска.
Есть несколько таблиц:
cat_item -- элементы каталога с описанием. в полях name, phone, work_time
cat_street -- таблица названий улиц и т.д. все связаны с cat_item
И потом по выбранным полям ищем MATCH-ем. Для того и FULLTEXT.
...
Рейтинг: 0 / 0
24.03.2015, 15:52:54
    #38915168
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Подзапрос - это фактически новая, пусть и временная, таблица. Которая, ясен пень, никак не индексирована. Так что FULLTEXT поиск на ней в принципе невозможен.
...
Рейтинг: 0 / 0
24.03.2015, 16:18:12
    #38915232
sniffysko1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Akina,

И чтоже теперь делать? Не подскажете?
Самое умное, что мне пришло в голову, это создать поле, в которое сливать весь текст, который связан с записью таблицы.
А искать по этому полю. Только решение это душу мне не греет.
...
Рейтинг: 0 / 0
24.03.2015, 16:26:36
    #38915251
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Если нужно найти слово в группе полей - то делайте отбор в самОм подзапросе:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
FROM (
  SELECT
  ci.id, ci.name, cs.name AS street_name, ci.number, ci.phone, ci.work_time,
  cn.name AS n_name, cn.number AS n_number, cn.phone AS n_phone, cn.work_time AS n_work_time, csn.name AS n_street_name,
  ct.name as tag
  FROM cat_item AS ci
  LEFT JOIN cat_street AS cs ON cs.id = ci.street
  JOIN cat_network AS cn ON cn.parent_id = ci.id
  LEFT JOIN cat_street AS csn ON csn.id = cn.street
  JOIN cat_item_tag AS cit ON cit.item_id = ci.id
  JOIN cat_tag AS ct ON ct.id = cit.tag_id
  WHERE visible = 'Y'
  AND 
  MATCH(ci.name, cs.name, ci.number, ci.phone, ci.work_time, cn.n_name, cn.n_number, cn.n_phone, cn.n_work_time, csn.name, ct.name) AGAINST('искомое_слово')
  ) AS joined_tbl
...
Рейтинг: 0 / 0
24.03.2015, 16:27:26
    #38915253
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Возможно, придётся делать MATCH..AGAINST потаблично (объединишь через OR).
...
Рейтинг: 0 / 0
24.03.2015, 17:29:29
    #38915359
sniffysko1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Akina,

MATCH не проканает.
А если так? Слить все искомые поля в строку и Лайком его.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT
	ci.id, ci.name, cs.name AS street_name, ci.phone, ci.number 
FROM cat_item AS ci
LEFT JOIN cat_street AS cs ON cs.id = ci.street
JOIN cat_network AS cn ON cn.parent_id = ci.id
LEFT JOIN cat_street AS csn ON csn.id = cn.street
JOIN cat_item_tag AS cit ON cit.item_id = ci.id
JOIN cat_tag AS ct ON ct.id = cit.tag_id
WHERE
	visible = 'Y' AND
	CONCAT_WS(' ', ci.name, cs.name, ci.number, ci.phone, ci.work_time, cn.name, cn.number, cn.phone, cn.work_time, csn.name, ct.name)
	LIKE '%аптек%'
GROUP BY ci.id
...
Рейтинг: 0 / 0
24.03.2015, 17:49:16
    #38915409
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Ну а сам-то как думаешь?
...
Рейтинг: 0 / 0
24.03.2015, 17:52:10
    #38915414
sniffysko1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Грустно получается. Вот как думаю. Что-то выдает, но не совсем то, что ожидал.
...
Рейтинг: 0 / 0
24.03.2015, 19:10:09
    #38915539
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
тут лайк самое правильное
а что ты ожидал и что выдаёт?
...
Рейтинг: 0 / 0
24.03.2015, 22:47:34
    #38915707
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
вадятут лайк самое правильное
Я думаю, что INSTR() ещё правильнее.
...
Рейтинг: 0 / 0
25.03.2015, 07:58:11
    #38915877
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Akinaвадятут лайк самое правильное
Я думаю, что INSTR() ещё правильнее.
возможно,
а есть данные по сравнению по скорости?
...
Рейтинг: 0 / 0
25.03.2015, 18:30:31
    #38916877
sniffysko1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
В общем, все красоты похерил. Сошелся на том, что создал поле и туда в момент обновления записи сливаю всю текстовую инфу по клиенту очищенную от шелухи: знаков препинания, тегов, коротких слов. И лайком его! как говорится, хотели как лучше, а вышло как обычно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вложенный запрос / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]