2012-06-13 33 views
1

我正在使用php和mysql的高级搜索功能。搜索多个表Mysql

的表是:

blogPost[id, title, description] 

water[id, title, description,] 

waterSpecie[id, waterId, specieId] 

specie[id, name] 

user[id, username] 

我想要做的是: 用户将能够从一个文本字段关键字搜索,其结果只能是唯一的一次。 例如:

用户搜索鳕鱼然后我想显示所有的鳕鱼标题或描述和所有的水中有鳕鱼在其中,并且如果用户是nicked鳕鱼的博客帖子。但是,如果让我们说blogPost在其标题和说明中加入了鳕鱼,我不希望它在结果列表中出现两次。

但是,如果只允许说blogPost表的鳕鱼的标题,我只想显示,没有别的。

我已经设法做到这一点与SQL查询:我现在想添加blogPost表到该查询,并使其可以从中进行搜索。所以如果只有一个表有鳕鱼,我只想显示该表的结果。

SELECT DISTINCT W.lat, W.lng, W.municipalityId, W.title, W.description 
FROM water AS W, specie AS S, waterSpecie AS WS 
WHERE S.name LIKE '%$term%' AND W.id = WS.waterId AND S.id = WS.specieId 
OR W.title LIKE '%$term%' AND W.id = WS.waterId AND S.id = WS.specieId; 

我希望我已经设法解释我的问题,并希望我可以在这个问题上得到一些帮助。

回答

0

通过简化MySQL查询并将结果结合到您的PHP代码中,您将得到最好的服务。在你的情况下,主要原因是你想结合不同的结果 - 博客条目,如果他们有搜索词和/或水域和其他东西,如果他们有搜索条件。

在伪代码,我会做这样的事情(使用真正的代码一个DAO,当然):

$foundposts = findblogposts($searchterm); 
$foundusers = findusers($searchterm); 
$foundwaters = findwaters($searchterm); 
// etc 

if($foundposts){ 
    print($foundposts); 
} 
if($founduers){ 
    print($foundusers); 
} 
if($foundwaters){ 
    print($foundwaters); 
} 
// etc 

这样的话,你可以处理你可能要显示不同的格式要求博客文章正确,和用户正确等

1

你可以试试这个:

Select distinct tablename,id from 
(select 'blogpost', as tablename, id, title as searchfield from blogpost 
union 
select 'blogpost' as tablename, id, description as searchfield from blogpost 
union 
select 'water' as tablename, id, description as searchfield from water 
union 
select 'specie' as tablename, id, name as searchfield from specie 
union 
select 'user' as tablename, id, username as searchfield from user) searcher 
where searcher.searchfield='cod' 

我不完全得到什么回事waterSpecie,所以我离开了出来。

你应该得到的结果是这样的:

tablename id 
blogpost  5 
user  12 

然后你就可以查询数据库获取与ID = 5博文的记录,从ID = 12的用户记录。

您将能够在您的PHP中以编程方式执行此操作。如果你添加一个你想添加到搜索功能的表,你只需要在下面的查询中添加一个UNION,而不是在一个WHERE子句中创建一个连接并添加另一个连接。

我不确定这会扩展到Amazon.com的大小,所以在你得到那么大之前,请比别人更好地咨询某人。