满足多行多个条件的MYSQL匹配条目

时间:2013-10-24 08:31:26

标签: php mysql

我认为对于那些使用MYSQL的人来说,这将是一个很容易的,但我不能完全理解......主要是因为不知道要搜索的正确术语。

基本上我有一个表格将标签ID映射到名为tag_map的照片ID。当我执行此查询时:

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

但我真正想要的是只选择tag_id为'1'和'5'的ph_id。

所以,正如您可能看到的那样,我正在尝试根据多个标签过滤掉选择。我想最终得到:

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解决方案,正如@Y U NO WORK

所建议的那样

基本上我从表'tags'

获取所有选定标签的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。

感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你必须根据ph_id加入表,然后检查table1实例的tab_id col是否等于1,table2实例的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';