我正在尝试在我的PHP文件上创建一个SQL SELECT语句,该语句可以选择其中一列中具有未知数量的不同值的所有行。为了更好地解释,我会说确切的情况。我的数据库中有三个表;测试,类别,部分。每个测试属于一个类别,大约有50个类别,每个类别属于一个部分,有10个部分。但是,在我的测试表中,它只有一个列所属的类。我现在希望能够在一个部分中显示所有测试。
所以要让事情更清楚:
SELECT * FROM tests WHERE category = '$categoryId' ORDER BY id ASC
这让我可以选择特定类别中的所有测试,但是我想进行某种循环,其中,根据选择的部分,类别ID被放在由OR分隔的此语句中。谢谢。
答案 0 :(得分:2)
SELECT t.*
FROM tests t
JOIN category c on t.category = c.id AND c.section = ' . $section . '
ORDER BY t.id ASC
这是为了向您展示在生产环境中应该清理$ section参数的方法。
我们的想法是将表连接在一起,以利用强大的关系数据库功能而不是程序化循环。
在内部,RDBMS正在为你做循环,计算每个JOINed表的中间结果集。
答案 1 :(得分:0)
如果要在一个部分中选择所有测试,则不应在类别ID上使用or语句,而应在这些表上使用join: 类似的东西:
SELECT tests.* FROM (tests JOIN categories ON tests.category = categories.id) WHERE categories.section = $section
其中$section
是您要选择测试的部分的ID。
您还可以指定要使用的列而不是*
来仅选择您感兴趣的列。
$ section应该被转义以确保它不能被注入。
我不知道你的表模式,但当你有这样的关系时,你应该在这些表中有外键,查询应该很快,你只需要一个!这是如何在数据模型上执行查询,因为关系存储在数据库中。
答案 2 :(得分:0)
使用示例管道符号|的特殊字符 并这样做:
$str="|".$cat1."|".$cat2."|".$cat3+"|";
并使用Like条件:
SELECT * FROM测试WHERE $ str喜欢'%|'+ cast(类别为varchar)+'|%'oRDER BY id ASC