【问题标题】:How can I select by multiple columns based on multiple values?如何根据多个值按多列选择?
【发布时间】:2014-07-05 07:57:51
【问题描述】:

我试图寻找答案,但没有找到任何东西,我不确定我是否以最好的方式描述了这一点,但是这里......

所以,我有一个 MySQL 数据库,以及一个用户可以选择 0-3 个类别来搜索数据库的网站。

例如,如果我在数据库中有这样的记录:

id|cat1|cat2|cat3
-----------------
1 |  a |  b |  c
2 |  a |    |
3 |  z |  b |  a
4 |  y |  a |
5 |  b |  c |  a 

我正在尝试找出一种方法,例如,如果用户选择要搜索的 1 个类别并且它是“a”,那么它将返回记录 [1,2,3,4,5],并且如果用户选择 2 个类别进行搜索,例如“a”和“b”,它将返回记录 [1,3,5],并且用户选择了 3 个类别,例如“a”和“c”和“b” , 那么它会返回 [1,5]。

无论是在数据库中还是在用户输入的内容中,都无法保证顺序。

我的查询可以选择具有任何输入类别的记录,但我似乎无法弄清楚如何只返回提供所有类别的记录。

有人知道怎么做吗?

谢谢!

这是我目前所拥有的,它很乱,我只是在这里在黑暗中拍摄,哈哈,但它就是这样(在这个例子中,选择了“教堂”和“职业”类别):

SELECT * FROM all_terms 
WHERE
(      (subject1 in ('Church', 'Occupation') OR subject1 IS NULL OR subject1 = '') 
   AND (subject2 in ('Church', 'Occupation') OR subject2 IS NULL OR subject2 = '') 
   AND (subject3 in ('Church', 'Occupation') OR subject3 IS NULL OR subject3 = '')
   AND (     (subject1 IS NOT NULL && subject1 != '') 
          OR (subject2 IS NOT NULL && subject2 != '') 
          OR (subject3 IS NOT NULL && subject3 != '')))

【问题讨论】:

标签: php mysql sql


【解决方案1】:

如果每个类别都是独一无二的,这将满足您的需求。你必须在上面设置你的 $mysqli 连接。

$query = "
SELECT *
FROM table
WHERE 
cat1 = ? AND cat2 = ? AND cat3 = ? AND cat4 = ?
";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ssss", $cat1, $cat2, $cat3, $cat4);
$stmt->execute();

如果类别不是唯一的,并且只是根据用户选择的内容按顺序排列,则可能会更加困难。

编辑:如果我们的问题相同,请查看this 的答案以获得一些见解。

【讨论】:

    【解决方案2】:

    您需要的一般查询结构是这样的:

    让用户选择a

    SELECT id
    FROM table1
    WHERE 'a' IN (cat1, cat2, cat3)
    

    让用户选择a, b

    SELECT id
    FROM table1
    WHERE 'a' IN (cat1, cat2, cat3)
      AND 'b' IN (cat1, cat2, cat3)
    

    让用户选择a, b, c

    SELECT id
    FROM table1
    WHERE 'a' IN (cat1, cat2, cat3)
      AND 'b' IN (cat1, cat2, cat3)
      AND 'c' IN (cat1, cat2, cat3)
    

    See this SQL fiddle

    您可以使用循环根据用户输入动态生成正确的语句,例如:

    假设$arr 是一个用户输入数组:

    $sql = 'SELECT id FROM table1 WHERE ';
    
    $and = '';
    
    foreach ($arr as $a) {
        $sql .= $and . "'$a' IN (cat1, cat2, cat3) ";
        $and = 'AND ';
    }
    

    例如,如果$arr = array('a', 'b'),那么生成的查询将是:

    SELECT id
    FROM table1
    WHERE 'a' IN (cat1, cat2, cat3)
      AND 'b' IN (cat1, cat2, cat3)
    

    See this PHP fiddle

    【讨论】:

    • 哦!我什至从未想过像那样“反转” IN 子句!这似乎有效!让我做更多的测试,如果它完全按照我的需要,我会报告并接受你的答案,谢谢!
    • 我不能让它不做我想做的事,这很好!哈哈...感谢您的出色回答。
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多