搜索多个表Mysql

时间:2012-06-13 13:33:12

标签: php mysql

我正在使用php和mysql进行高级搜索功能。

表格是:

blogPost[id, title, description]

water[id, title, description,]

waterSpecie[id, waterId, specieId]

specie[id, name]

user[id, username]

我想要做的是这样的: 用户将能够使用关键字从文本字段中进行搜索,结果应该只有一次唯一。 例如:

用户搜索鳕鱼然后我想要显示所有标题或描述中包含鳕鱼的博客帖子以及所有含有鳕鱼的水域以及用户是否有鳕鱼。但是,如果让我们说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;

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

2 个答案:

答案 0 :(得分: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的规模,所以在你做大事之前先咨询一下比我更好的人。

答案 1 :(得分: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

这样,您就可以处理正确显示博客帖子和正确用户等的不同格式要求。