我有一个看起来有点像下面的表,我正在使用多个字段进行搜索查询以优化搜索作业。目前我可以进入多个字段,但是,我的搜索结果会查询整个数据库,而不仅仅是查询一个特定的ID。
表:
contentId meta_key meta_value
1 1 vacancyType Hospitality
2 1 vacancyRole Chef
3 1 vacancyDate 2014-01-01
4 2 vacancyType Adin
5 2 vacancyArea St Albans
6 2 vacancyDate 2014-01-01
代码:
$getJobs1 = "SELECT distinct *
FROM cms_contentExtra, cms_content
WHERE cms_contentExtra.meta_value IN ('$type','$key')
AND cms_content.contentId = cms_contentExtra.contentId
GROUP BY cms_content.contentId";
$getJobs2 = mysql_query($getJobs1) or die("didn't query");
while ($getJobs3 = mysql_fetch_array($getJobs2)) {
echo ' - ' . $getJobs3[meta_value] . ' - ' . ' - ' . $getJobs3[contentId];
}
这将返回:
- St Albans - - 8435 - St Albans - - 8436 - Hospitality & Catering - - 8437 - St Albans - - 8440 - Hospitality & Catering - - 8444 - Hospitality & Catering - - 8450 - Hospitality & Catering - - 8451 - St Albans - - 8453
但是,我只希望显示具有区域和类型的结果,而忽略其他结果。目前它似乎是显示类型然后单独显示区域,所以我无法在特定区域显示类型。
我使用两个表来将contentId与存储在不同表中的更多数据进行比较。
答案 0 :(得分:0)
您使用的IN
操作数是OR
操作。
尝试使用LIKE
,例如:
WHERE cms_contentExtra.meta_value LIKE "%$type%$key%"
OR cms_contentExtra.meta_value LIKE "%$key%$type%"
答案 1 :(得分:0)
让我们仔细看看您的查询。您按contentId分组。所以你得到每个contentId一条记录。但是你选择*。 (这必须是MySQL,因为我不知道任何其他dbms允许这样做。)因此,您获得属于内容ID的内容记录,以及属于内容ID的一个(随机)cms_contentExtra记录。然后使用DISTINCT,因此您只能获得不同的行。但行必须是不同的,因为它们至少在内容id上有所不同。说完这个,你的查询没有意义,我建议你在书或教程中查找GROUP BY和DISTINCT。 (此外,你不应该使用以逗号分隔的连接语法。二十多年前用显式连接替换了它。改为使用INNER JOIN。)到目前为止: - )
为了清理你,我一步一步引导你。也许这不是你想要的,但我认为它将帮助你建立最终的查询。
获取空缺类型为$ type的内容ID:
select contentid
from cms_content
where meta_key = 'vacancyType' and meta_value = @type;
获取位置为$ key的内容ID:
select contentid
from cms_content
where meta_key = 'vacancyArea' and meta_value = @key;
获取与$ type或$ key匹配的内容ID:
select distinct contentid
from cms_content
where (meta_key = 'vacancyType' and meta_value = @type)
or (meta_key = 'vacancyArea' and meta_value = @key);
获取与$ type和$ key匹配的内容ID:
select contentid
from cms_content
where (meta_key = 'vacancyType' and meta_value = @type)
or (meta_key = 'vacancyArea' and meta_value = @key)
group by contentid
having count(*) = 2;