2015-03-23 3 views
1

У меня есть общий предел для пагинации, который отображает 30 элементов на страницуЗапроса из нескольких таблиц, разделяющих же LIMIT

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

полей Таблица A news_id, название, содержание Таблица полей B events_id, название, содержание Таблица полей C enc_id, название, содержание

А где состояние

WHERE (MATCH (title) AGAINST('{$search}') OR MATCH(content) AGAINST('{$search}')OR MATCH(resume) AGAINST('{$search}')) 

Также каждая строка таблицы имеет поле состояния, которое должно быть равно 1 в условии where.

В конце мне нужно сделать LIMIT $start_from, 30 для глобального запроса

Любой возможный способ сделать это?

** EDIT **

Это вопрос, который я использую для одной таблицы

"SELECT 
    news_id,title, 
    FROM news 
    WHERE (MATCH (title) AGAINST('{$search}') OR MATCH(resume)  AGAINST('{$search}')OR MATCH(content) AGAINST('{$search}') 

    AND noticias.status = 1 

    LIMIT 0, 30" 

И это то, что я пытался, но безуспешно. он должен привезти 7 строк, но приносит 30 вместо них

SELECT 
news.news_id AS id, 
events.events_id AS id, 
enc.enc_id AS id, 
news.title AS title, 
events.title AS title, 
enc.title AS title 

FROM news, events, enc 

WHERE (MATCH (news.title) AGAINST('{$search}') OR MATCH(news.resume) AGAINST('{$search}')OR MATCH(news.content) AGAINST('{$search}') 
OR MATCH (enc.title) AGAINST('{$search}') OR MATCH(enc.resume) AGAINST('{$search}')OR MATCH(enc.content) AGAINST('{$search}') 
OR MATCH (events.title) AGAINST('{$search}') OR MATCH(events.resume) AGAINST('{$search}')OR MATCH(events.content) AGAINST('{$search}')) 

AND (news.status = 1 OR enc.status = 1 OR events.status = 1) 

LIMIT 0, 30 
+0

Что вы пробовали? Дайте образцы данных и ожидаемый результат. Будет оценен SQLFiddle. –

+0

Можете ли вы разместить полный запрос? Это дает лучшее представление о том, чего вы пытаетесь достичь. –

+0

Конечно, я обновил код. – DannyG

ответ

2

Я нашел решение, поэтому я поделюсь им здесь, если кому-то еще это понадобится.

Использование UNION:

(SELECT news_id AS id, title, 'news' AS origin FROM news WHERE (MATCH (title) AGAINST('{$search}') OR MATCH(resume) AGAINST('{$search}')OR MATCH(content) AGAINST('{$search}') AND status = 1)) 
UNION 
(SELECT events_id AS id, title, 'events' AS origin FROM events WHERE (MATCH (title) AGAINST('{$search}') OR MATCH(resume) AGAINST('{$search}')OR MATCH(content) AGAINST('{$search}') AND status = 1)) 
UNION 
(SELECT enc_id AS id, title, 'enc' AS origin FROM enc WHERE (MATCH (title) AGAINST('{$search}') OR MATCH(resume) AGAINST('{$search}')OR MATCH(content) AGAINST('{$search}') AND status = 1)) 
LIMIT $start_from, 30 

Я использую поле origin знать из какой таблицы содержание каждого пришел.

Смежные вопросы