2017-02-14 20 views
0

Mysql запрос в сфинкса конфигурации:неправильные результаты сопоставления с Sphinx

SELECT 
    c.id, 
    c.name, 
    p.vendor 
FROM 
    categories AS c 
LEFT JOIN (
    SELECT DISTINCT 
     vendor, 
     category_id 
    FROM 
     clothes 
) p ON c.id = p.category_id 
ORDER BY 
    c.name 

Запрос дает такую ​​структуру (позвольте мне назвать это результата):

id name vendor 
178 dress Liu Jo Jeans 
178 dress Bergamoda 
178 dress Rifle 
190 dress Moda Corazon 
190 dress Bergamoda 
205 boots Bergamoda 

режим матча Сфинкс SPH_MATCH_ANY. Неприятности начинаются, когда я пытаюсь сделать Query('dress'), это приводит к

178 dress Liu Jo Jeans 
190 dress Moda Corazon 

Но мне нужны все результаты, где name или vendor поле содержит «платье» (ожидаемый результата без сапог).

Что я делаю неправильно? Заранее спасибо!

UPDATE для Данило Бустоса
категории структуры: id (integer,auto increment), name (varchar,255), parent_id (integer).
одежды структура: id (integer,auto increment), name (varchar,255), vendor (varchar,255)

Ожидая результат:

id name vendor 
178 dress Liu Jo Jeans 
178 dress Bergamoda 
178 dress Rifle 
190 dress Moda Corazon 
190 dress Bergamoda 
+0

Можете ли вы скопировать структуру таблиц и определить пример ожидаемого результата? –

+1

Главное сообщение обновлено – 966p

ответ

1

Одна из ваших главных проблем является «документ-идентификатор» в сфинкса должно быть уникальным. Кажется, вы используете category_id. Тем не менее, в вашем результате A есть несколько строк с одним и тем же идентификатором. Это приводит к непредсказуемым результатам в Сфинксе.

В целом кажется, что вы должны использовать идентификатор из одежды в качестве идентификатора документа. Таким образом, можно получить несколько строк, так как оно должно быть уникальным. Вы можете поместить category_id в атрибут sphinx, если хотите, чтобы набор результатов содержал его.

(возможно, вам придется изменить свой «внутренний» запрос, чтобы получить идентификатор в таблице соединений, используйте команду GROUP BY, а не DISTINCT, чтобы дедуплицировать, хотя, возможно, даже не нужно, просто может использоваться стандартная JOIN между двумя таблицами)

+0

Отличный ответ, решена проблема темы, спасибо! – 966p