我认为对于那些使用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。
感谢大家的帮助。
答案 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';