2013-10-24 112 views
0

对于那些使用MYSQL的人来说,我认为这将是一件容易的事,但我无法完全理解它......主要是因为不知道正确的术语来搜索。MYSQL匹配满足多个条件的条目

基本上我有一个表映射标签ID到照片ID,称为tag_map。当我执行此查询:

SELECT * FROM tag_map WHERE tag_id='1' OR tag_id='5'; 

我得到如下结果:

ph_id tag_id 
1  1 
2  1 
5  1 
7  5 
8  1 
9  5 
10  5 
11  1 
12  1 
13  1 

但我真正想要的是只选择ph_id有两个“1” TAG_ID和“5”。

因此,正如你可能看到的,我试图根据多个标签过滤选择。我想结束了:

ph_id tag_id 
7  1 
7  5 
8  1 
8  5 
11  1 
11  5 

所以ph_id 7,第8和11参考TAG_ID 1和5

希望是有道理的。

谢谢。

解决方案

由于我查询的动态特性(用户选择任意数量的可用标签为“缩小选择)我去一个PHP的解决方案,通过@YU没有工作的建议

基本上我从表'标签'中获取所有选定标签的tag_id

然后,我从我的表tag_map中选择了映射到所选tag_ids的所有照片ID(ph_id)。

然后我减少这个向下发生的相同的次数作为所选标签的数量ph_ids:

$numTags = count($arTagId); //$arTagId is an array of the selected tags 

// get only photo ids that match both tags 
$arPhId = array(); 
// in arPhId, find ph_ids that have occurances equal to $numTags 
$arPhIdCnt = array_count_values($arPhIdAll); //$arPhIdAll is array of all ph_id that match all selected tag_ids 

foreach($arPhIdCnt as $pid => $pidQty) { 
    if($pidQty == $numTags) { 
    $arPhId[] = $pid; 
    } 
} 

所以我最终只匹配两者tag_ids该ph_ids的阵列。

感谢大家的帮助。

回答

1

你必须自己加入表格,代码可能有点复杂。 PHP会更容易,但不是这样的高性能解决方案。

+0

我开始怀疑PHP是否可能是路线...无论如何,我使用PHP构建查询。 – j0nr

+0

PHP确实比较容易,但对于您的Web服务器而言性能会降低。您只需使用他们的tag_ids保存所有ph_ids。然后你使用“array_count_values($ ph_id)”,只保存那些函数值高于1的地方。 –

0

我们根据您的ph_id自身加入表,然后检查表1实例的tab_id山坳等于1和表2实例是tab_id等于5

SELECT t1.* FROM tag_map t1, tag_map t2 
WHERE t1.ph_id = t2.ph_id 
AND t1.tag_id='1' 
AND t2.tag_id='5'; 

与内部联接,如果你喜欢

SELECT t1.* FROM tag_map t1 
INNER JOIN tag_map t2 on t2.ph_id=t1.ph_id 
WHERE t1.tag_id='1' 
AND t2.tag_id='5'; 
+0

这太好了,那么简单......但如果我有3个tag_ids?或4 ...它只是'SELECT t1。* FROM tag_map t1,tag_map t2,tag_map t3 WHERE t1.ph_id = t2.ph_id(这里有什么?) AND t1.tag_id ='1' AND t2。 tag_id ='5' AND t3.tag_id ='n';' – j0nr

+0

@ j0nr在这种情况下,您可以像这样处理它SELECT t1。* FROM tag_map t1,tag_map t2,tag_map t3 WHERE t1.ph_id = t2.ph_id和t2.ph_id = t3.ph_id AND t1.tag_id ='1'AND t2.tag_id ='5'AND t3.tag_id ='n'; – melc