0

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

所以为了让事情更清楚:

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

这使我可以选择特定类别中的所有测试,但我想创建某种循环,根据选择的部分,类别 ID 放在此语句中,由 OR 分隔。谢谢你。

4

3 回答 3

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 表的中间结果集。

于 2013-04-20T20:08:30.157 回答
0

如果您想在一个部分中选择所有测试,那么您不应在类别 ID 上使用 or 语句,而应在这些表上使用 join:类似于:

SELECT tests.* FROM (tests JOIN categories ON tests.category = categories.id) WHERE categories.section = $section

$section您要选择测试的部分的 id在哪里。您还可以指定要使用的列,而不是*只选择您感兴趣的列。 $section 应该被转义以确保它不能被注入。

我不知道你的表模式,但是当你有这样的关系时,你应该在这些表中有外键,查询应该很快,你只需要一个!这是对数据模型执行查询的方法,因为关系直接存储在数据库中。

于 2013-04-20T20:10:59.340 回答
0

使用特殊字符作为示例管道符号 | 并这样做:

   $str="|".$cat1."|".$cat2."|".$cat3+"|";

并使用 Like 条件:

SELECT * FROM tests WHERE $str like '%|'+cast(category as varchar) +'|%' oRDER BY id ASC

于 2013-04-20T20:24:16.487 回答