2015-11-10 3 views
2

У меня возникли некоторые проблемы с попытками исправить этот запрос будетSQL поиска Результат, группа по номеру

Это пользовательский поисковый запрос, который ищет слово «свадьбы» на всех страницах этого CMS.

На данный момент я получаю ту же страницу в первых 5 строках, потому что слово 'weddings' появляется 5 раз. То, что я хочу сделать, - объединить строки с тем же идентификационным номером в 1 строку, чтобы он не появлялся несколько раз.

Я думал, что делает группу, в конце этого заявления будет делать это, но я получаю ошибку синтаксиса SQL

GROUP BY `documents`.`id` 

Я приложил полный SQL сильфон с изображением выхода я в настоящее время получаю .... Есть идеи?

SELECT `documents`.*, 
`documenttypes`.`name` as `doctype`, 
`articles`.`id` as `article_id`, 
`articles`.`language_id`, 
`articles`.`title`, 
`articles`.`template`, 
`articles`.`slug`, 
`articles`.`path`, 
`articles`.`slug_title`, 
MATCH (elements.textvalue)AGAINST ('weddings') AS score, 
elements.textvalue AS matching, 
LOWER(`articles`.`title`) 
LIKE '%weddings%' as 'like_title', 
(MATCH (elements.textvalue) 
AGAINST ('weddings')) + IF((LOWER(`articles`.`title`) 
LIKE '%weddings%'),1, 0) + IF((LOWER(`elements`.`textvalue`) 
LIKE '%weddings%'),1, 0) as total FROM (`documents`) 
LEFT JOIN `articles` ON `articles`.`document_id` = `documents`.`id` 
LEFT JOIN `documenttypes` ON `documents`.`documenttype_id` = `documenttypes`.`id` 
LEFT JOIN `documents_users` AS du ON `documents`.`id` = du.`document_id` 
LEFT JOIN `documents_usergroups` AS dug ON `documents`.`id` = dug.`document_id` 
LEFT JOIN elements ON `elements`.`article_id` = `articles`.`id` 
WHERE `documents`.`trashed` = 0 
AND `documents`.`published` = 1 
AND `articles`.`status_id` = 1 
AND `articles`.`language_id` = 1 
AND (`documents`.`no_search` = '0' 
OR `documents`.`no_search` IS NULL) 
AND ((dug.usergroup_id IS NULL) 
AND (du.user_id IS NULL)) 
AND (`documents`.`startdate` < NOW() 
OR `documents`.`startdate` = '0000-00-00 00:00:00' OR `documents`.`startdate` IS NULL) 
AND (`documents`.`enddate` > NOW() 
OR `documents`.`enddate` = '0000-00-00 00:00:00' 
OR `documents`.`enddate` IS NULL) 
HAVING (total > 0) 
ORDER BY label ASC, 
total DESC LIMIT 0,10 

enter image description here

+0

Вы добавили GROUP BY 'документы'.' Перед тем. –

+0

Вам не нужно «' GROUP BY''' или '' 'DISTINCT''', в этом случае ваша проблема представляет собой соотношение между 1: N или N: N между вашими таблицами, я рекомендую проверять один за другим, например: '' 'documents_usergroups. *' '' в этом же запросе и найти столбец, который приносит разные данные для одного и того же '' 'documents.id''' –

+0

Я сделал @Suchit, но он только кажется, что выводит 1 результат, который является ID 186, Остальные, похоже, исчезают –

ответ

0

Вы можете попытаться использовать оператор DISTINCT:

SELECT DISTINCT 'documents'.*, 
'documenttypes'.'name' as 'doctype', 
'articles'.'id' as 'article_id', 
... 

GROUP BY позволяет использовать агрегатные функции, как AVG, MAX, MIN, SUM и COUNT, которые вы, видимо, дон Не используйте.

+0

Использование DISTINCT не изменяет результат –