过滤MySQL中的项目

时间:2015-09-03 02:17:08

标签: php mysql

现在我正在开发一个新闻网站。每条新闻都有一个标签。用户可以按标签过滤新闻。他有三个字段(所有字段都是可选的填充)

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

我认为它涵盖了第一和第三个领域,但我已经坚持第二个

1 个答案:

答案 0 :(得分:1)

我建议使用group byhaving,如下所示:

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是数字,那么不应该对常量使用单引号。数字比较的字符串常量具有误导性。