我试着寻找答案,但没有找到任何答案,我不确定我是否以最好的方式描述了这一点,但这里有...
所以,我有一个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 != '')))
答案 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)
您可以使用循环根据用户输入动态生成正确的语句,例如:
鉴于$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)
答案 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答案,以获得一些见解。