现在我正在开发一个新闻网站。每条新闻都有一个标签。用户可以按标签过滤新闻。他有三个字段(所有字段都是可选的填充)
1)文章中至少应有一个标签
2)必须在每篇文章中的标签
3)不得在文章
中的标签与包含表格
的文章相关联的标签function stackTrace() {
$stack = debug_backtrace();
$output = '';
$stackLen = count($stack);
for ($i = 1; $i < $stackLen; $i++) {
$entry = $stack[$i];
$func = $entry['function'] . '(';
$argsLen = count($entry['args']);
for ($j = 0; $j < $argsLen; $j++) {
$my_entry = $entry['args'][$j];
if (is_string($my_entry)) {
$func .= $my_entry;
}
if ($j < $argsLen - 1) $func .= ', ';
}
$func .= ')';
$entry_file = 'NO_FILE';
if (array_key_exists('file', $entry)) {
$entry_file = $entry['file'];
}
$entry_line = 'NO_LINE';
if (array_key_exists('line', $entry)) {
$entry_line = $entry['line'];
}
$output .= $entry_file . ':' . $entry_line . ' - ' . $func . PHP_EOL;
}
return $output;
}
当用户按`news_id`|`tag_id`
1 | 2
4 | 1
4 | 4
5 | 1
5 | 5
... | ...
时,我会收到代码ID。
如何使用一个mysql查询过滤Save filter
?
现在,我有了这个查询
news_id
我认为它涵盖了第一和第三个领域,但我已经坚持第二个
答案 0 :(得分:1)
我建议使用group by
和having
,如下所示:
SELECT news_id
FROM `app_news_newstag`
GROUP BY news_id
HAVING sum(tag_id IN ('1', '4', '5')) = 3 AND
sum(tag_id` IN ('2')) = 0;
总和找到匹配数。假设文章上没有重复的标签,那么您可以只计算每篇文章的匹配项。在数值上下文中,MySQL将布尔表达式视为1表示为true,0表示为false,这就是为什么这样做(没有case
)。
第二个条件只是检查标签是否永远不存在。
注意:如果id是数字,那么不应该对常量使用单引号。数字比较的字符串常量具有误导性。