我有一个检索 id + NAME 列表的查询:
$sql = "SELECT id FROM #__table1 ";
$sql .= " WHERE (";
foreach($explode_tags as $k=>$explode_tag) {
$sql .= "name = ".$db->Quote(trim($explode_tag));
if(($k+1) != count($explode_tags))
$sql .= " OR ";
}
$sql .= ")";
$db->setQuery($sql);
$results = $db->loadResultArray();
结果是一个像这样的数组:
keywordID | NAME
1 cat
2 dog
3 horse
现在我有这个表2:
id | ItemID | keywordID
1 4 1
2 4 2
3 4 3
4 6 1
5 6 2
6 7 1
我想从表 2 中查找包含在表 1 中找到的所有关键字 ID 的所有 ItemID。 在上面的示例中,我只想返回包含所有关键字(全部 3 个)的 itemID 4。
我正在运行此查询,但没有得到结果:
...
$query .= " AND i.id IN (SELECT itemID FROM #__table2 WHERE (";
foreach($results as $k=>$result) {
$query .= "keywordID = ".(int)$result;
if(($k+1) != count($results))
$query .= " AND ";
}
$query .= "))";
最佳答案
更新
抱歉,我错过了阅读您的问题。我使用这些数据做了简单的测试:
id itemId keywordId
1 4 1
5 4 2
6 4 3
7 5 2
8 5 3
9 6 1
10 6 2
11 6 3
12 7 3
13 9 3
14 9 2
15 9 1
并使用此查询:
SELECT itemId, GROUP_CONCAT( keywordId ORDER BY keywordId ) AS crpcnct, COUNT( itemId )
FROM `temporary_table_123`
GROUP BY 1
HAVING crpcnct = '1,2,3'
我可以得到你想要的值:
itemId crpcnct count(itemId)
4 1,2,3 3
6 1,2,3 3
9 1,2,3 3
要实现此目的,您所要做的就是构建要使用的keywordID:
$keywordIds[] = $results['keywordId'];
然后升序排序
sort($keywordIds);
最后一步是,将此数组提供给查询:
SELECT itemId, GROUP_CONCAT( keywordId ORDER BY keywordId ) AS crpcnct, COUNT( itemId )
FROM `temporary_table_123`
GROUP BY 1
HAVING crpcnct = '" . implode(",", $keywordIds) . "'
给你了。
关于mysql - 从表中选择存在数组所有值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9297374/