MySQL:仅当in()中的所有值与结果匹配时返回 解决方案 查询 Joomla SQL
这是自定义模块中的Joomla SQLMySQL:仅当in()中的所有值与结果匹配时返回 解决方案 查询 Joomla SQL,mysql,joomla,tags,Mysql,Joomla,Tags,这是自定义模块中的Joomla SQL // Create a new query object. $subQuery = $db->getQuery(true); $query = $db->getQuery(true); $tags = array('facebook','html5'); $count = count($tags); $tags = '"' . implode('","',$tags) . '"'; $subQuery ->select(array(
// Create a new query object.
$subQuery = $db->getQuery(true);
$query = $db->getQuery(true);
$tags = array('facebook','html5');
$count = count($tags);
$tags = '"' . implode('","',$tags) . '"';
$subQuery
->select(array('b.content_item_id as id','COUNT(DISTINCT b.tag_id) as rc'))
->from($db->quoteName('#__contentitem_tag_map','b'))
->join('INNER', $db->quoteName('#__tags', 'c') . ' ON (' . $db->quoteName('b.tag_id') . ' = ' . $db->quoteName('c.id') . ')')
->where(($db->quoteName('c.alias') . ' IN ('.$tags.')'))
->group($db->quoteName('b.content_item_id'));
$query
->select(array('a.introtext'))
->from('('.$subQuery.')f')
->join('INNER', $db->quoteName('#__content', 'a') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('f.id') . ')')
->join('INNER', $db->quoteName('#__contentitem_tag_map', 'b') . ' ON (' . $db->quoteName('a.id') . ' = ' . $db->quoteName('b.content_item_id') . ')')
->join('INNER', $db->quoteName('#__tags', 'c') . ' ON (' . $db->quoteName('b.tag_id') . ' = ' . $db->quoteName('c.id') . ')')
->where(($db->quoteName('c.alias') . ' IN ('.$tags.')'), 'AND')
->where(($db->quoteName('f.rc') . ' = ' . $count))
->group($db->quoteName('a.id'))
->order('a.title ASC');
我正在使用MySQL和Joomla的内容!3.8数据库
使用中的表格
__内容
__contentitem_标记_映射
__标签
故事
我用开发者的个人资料写了一些文章。每个开发人员都可以使用jQuery、html5等技能来标记自己。
这些技能作为标记存储在_标记表中
我尝试从内容表中选择与我正在搜索的标记匹配的所有开发人员
例如,我正在寻找一个开发人员,他既能做“HTML5”又能做“JavaScript”
结果应该是空的,因为在我的数据库中只有一个用于“HTML5”和“CSS3”的dev和另一个用于“CSS3”的dev
丑陋的事实
搜索“HTML5”和“Javascript”将返回1个结果
应该是这样的
搜索“HTML5”和“Javascript”应返回0个结果,因为没有同时具备这两种技能的开发人员
询问
问题
怎么办?顺便说一下,我不能使用像COUNT\*=x这样的东西;因为将有多个带有多个标记的结果
谢谢你的支持 我试着为你的问题找到一个解决办法,我不确定查询是否能更好;我不太喜欢在“html5”和“javascript”中重复两次条件c.alias 也许这对您来说并不重要,但是这个查询也可以在Mysql以外的其他db引擎上使用,例如MSSQL,因为它不使用GROUP_CONCAT或permissive GROUP BY子句 查询似乎适用于除两个以外的更多值,例如要检查的三个别名,当然也改变了RC的条件 在内部,它统计表_contentitem_tag_map中存在的每个标记的不同值:因此在外部,查询可以提取至少有两个或所需数量的标记,在其中条件RC=xx值存在时指定。这允许模拟所需的类型和条件。在外部零件查询中,进行其他必要的联接以提取所需的列。 在内部,正如您所看到的,不需要使用表内容 我在示例数据中添加了以下数据:
INSERT INTO `#__content` (`id`, `title`) VALUES (29, 'New one');
INSERT INTO `#__contentitem_tag_map` (`content_item_id`, `tag_id`) VALUES (29, 6);
INSERT INTO `#__contentitem_tag_map` (`content_item_id`, `tag_id`) VALUES (29, 1);
INSERT INTO `#__tags` (`id`, `alias`) VALUES (1,'facebook');
SELECT F.ID,
A.title as title,
B.tag_id,
C.alias as tag_alias
FROM (SELECT b.content_item_id as id,
COUNT(DISTINCT b.tag_id) AS RC
FROM `#__contentitem_tag_map` AS b
INNER JOIN `#__tags` AS c ON b.tag_id = c.id
WHERE c.alias IN ('html5','facebook')
GROUP BY b.content_item_id
) F
INNER JOIN `#__content` A ON A.id = F.id
INNER JOIN `#__contentitem_tag_map` B ON a.id = B.content_item_id
INNER JOIN `#__tags` C ON B.tag_id = C.id
WHERE C.alias IN ('html5','facebook')
AND F.RC=2;
;
输出:
ID title tag_id tag_alias
1 29 New one 6 html5
2 29 New one 1 facebook
你能详细说明一下吗?因为会有多个结果和多个标签@例如,当我只搜索“HTML5”时,我必须在“HTML5”中编写c.alias,并使用COUNTDISTINCT c.id=1。问题是:即使数据库中有两个开发人员可以使用HTML5,我也只能得到一个结果……当有一个开发人员同时具备这两种技能时,你能发布预期的结果吗?@etsa我会用不同的标记别名得到两次相同的结果,所以我使用Goup By来消除重复的条目。因此,你的输出仅由列id和标题生成吗?我删除了一个表__来自内部连接的内容相同的结果我必须更改:按b.content\u item\u id作为id分组->按b.content\u item\u id分组您的解决方案似乎适合我。非常感谢你!使用3个标记:使用2个标记:使用1个标记:
INSERT INTO `#__content` (`id`, `title`) VALUES (29, 'New one');
INSERT INTO `#__contentitem_tag_map` (`content_item_id`, `tag_id`) VALUES (29, 6);
INSERT INTO `#__contentitem_tag_map` (`content_item_id`, `tag_id`) VALUES (29, 1);
INSERT INTO `#__tags` (`id`, `alias`) VALUES (1,'facebook');
SELECT F.ID,
A.title as title,
B.tag_id,
C.alias as tag_alias
FROM (SELECT b.content_item_id as id,
COUNT(DISTINCT b.tag_id) AS RC
FROM `#__contentitem_tag_map` AS b
INNER JOIN `#__tags` AS c ON b.tag_id = c.id
WHERE c.alias IN ('html5','facebook')
GROUP BY b.content_item_id
) F
INNER JOIN `#__content` A ON A.id = F.id
INNER JOIN `#__contentitem_tag_map` B ON a.id = B.content_item_id
INNER JOIN `#__tags` C ON B.tag_id = C.id
WHERE C.alias IN ('html5','facebook')
AND F.RC=2;
;
ID title tag_id tag_alias
1 29 New one 6 html5
2 29 New one 1 facebook