1

我正在使用 php 和 mysql 开发高级搜索功能。

这些表是:

blogPost[id, title, description]

water[id, title, description,]

waterSpecie[id, waterId, specieId]

specie[id, name]

user[id, username]

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

用户搜索鳕鱼,然后我想显示所有标题或描述中有鳕鱼的博文,以及所有有鳕鱼的水域,以及用户是否是鳕鱼。但是,如果假设 blogPost 的标题和描述中有 cod,我不希望它在结果列表中出现两次。

但是,如果只是说 blogPost 表的标题中有 cod,我只想展示它而不是其他任何东西。

我已经设法用这个 sql 查询做到了:我现在想将 blogPost 表添加到该查询中,并使其可以从中进行搜索。因此,如果只有一个表有 cod,我只想显示该表的结果。

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;

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

4

2 回答 2

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 的 blogpost 的记录,以及 id=12 的 user 的记录。

您将能够在 PHP 中以编程方式执行此操作。而且,如果您添加一个要添加到搜索功能的表,您只需通过在下面的查询中添加一个 UNION 来完成,而不是进行连接并将另一部分添加到 WHERE 子句中。

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

于 2012-06-13T16:11:02.697 回答
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

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

于 2012-06-13T14:26:06.490 回答