我可以在SQL SELECT语句中有一个循环吗?

时间:2013-04-20 19:57:55

标签: php mysql database

我正在尝试在我的PHP文件上创建一个SQL SELECT语句,该语句可以选择其中一列中具有未知数量的不同值的所有行。为了更好地解释,我会说确切的情况。我的数据库中有三个表;测试,类别,部分。每个测试属于一个类别,大约有50个类别,每个类别属于一个部分,有10个部分。但是,在我的测试表中,它只有一个列所属的类。我现在希望能够在一个部分中显示所有测试。

所以要让事情更清楚:

SELECT * FROM tests WHERE category = '$categoryId' ORDER BY id ASC

这让我可以选择特定类别中的所有测试,但是我想进行某种循环,其中,根据选择的部分,类别ID被放在由OR分隔的此语句中。谢谢。

3 个答案:

答案 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