如何根据多个值选择多列?

时间:2014-05-16 18:40:43

标签: php mysql sql

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

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

例如,如果我在DB中有这样的记录:

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 != '')))

2 个答案:

答案 0 :(得分:1)

您需要的常规查询结构如下:

让用户选择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

答案 1 :(得分:0)

如果每个类别都是唯一的,这将执行您正在寻找的内容。您必须在上面设置$ 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答案,以获得一些见解。