Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:仅当in()中的所有值与结果匹配时返回 解决方案 查询 Joomla SQL_Mysql_Joomla_Tags - Fatal编程技术网

MySQL:仅当in()中的所有值与结果匹配时返回 解决方案 查询 Joomla SQL

MySQL:仅当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(

这是自定义模块中的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('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