2013-08-02 111 views
0

我有一个工作的搜索功能为我的新闻网站,但我一直在重写我的代码和重组我的数据库,以添加更多的功能。之前,我想要搜索的所有信息都可以在一张表中找到。现在有一个新闻文章的基本数据表,第二个包含文本(每个文章可能有多行)。第一个搜索功能很简单:通过多个表搜索

SELECT * 
FROM pages 
WHERE page_status != '99' 
AND (page_title LIKE '%".mysql_real_escape_string($words)."%' OR page_text LIKE '%".mysql_real_escape_string($words)."%') 
ORDER BY page_onlinedate DESC 

现在我需要查询多个表,如“pages.page_text”已经不存在了。它移至名为“page_content.content_text”的第二个表格,并通过“page_content.content_page_id”链接至“pages.page_id”。

我找不到重复的结果(查询每个表一次,并且可能在page_content中有多行,如果搜索结果可能会显示相同的文章,例如四次)单词可以在标题和每个文本行中找到一次)。我想它必须用表连接来完成,但连接会让我感到困惑。

再一次,我的数据库布局是明确的:

PAGES 
page_id 
page_title 
page_onlinedate 
... 

PAGE_CONTENT 
content_id 
content_text 
content_page_id 

谢谢您的帮助。

+0

为了获得有用的答案,你可能必须提供一个[sqlfiddle(http://sqlfiddle.com/ )填入一些样本数据以使事情更清楚。 –

回答

0

请试试这个:

select p.*, pc.* 
from pages p join page_content pc on p.page_id = pc.content_page_id 
where p.page_status != '99' 
    and (p.page_title like '%" . mysql_real_escape_string($words) . "%' or pc.content_text like '%" . mysql_real_escape_string($words) . "%') 
group by p.page_id 
order by p.page_onlinedate desc; 
+0

这个人就像一个魅力。谢谢@vinodadhikary! – purplizer

+0

@purplizer,不客气。 – vee

0

试试这个:

SELECT * 
FROM pages 
WHERE page_status != '99' 
     AND (page_title LIKE '%".mysql_real_escape_string($words)."%' 
       OR page_id IN (SELECT content_page_id 
          FROM page_content 
          WHERE 
       page_text LIKE '%".mysql_real_escape_string($words)."%' 
          )) 
ORDER BY page_onlinedate DESC 
+0

这一个进入无限循环。上面的其他答案就像一个魅力。非常感谢您尽力帮助! – purplizer