2013-04-20 132 views
0

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

因此,为了使事情更清晰:

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

这让我选择一个特定的类别中的所有测试,但我希望做一些梳理,在那里,这取决于哪一个环段被选中,类别编号被放在由OR分隔的这个语句中。谢谢。

+0

之前这样做。在实际查询之前创建您的OR语句,并将查询字符串分配给变量categoryIds,然后执行'SELECT * FROM tests'。$ categoryIds。' ORDER BY id ASC' – user1048676 2013-04-20 20:01:09

+0

而且,请不要将categoryId变量插入到SQL语句中。看看这个问题为什么:http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work – 2013-04-20 20:18:15

回答

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表的中间resulset。

+0

你美丽的人类。谢谢。 – 2013-04-20 21:19:32

+0

...你让我的一天;) – Sebas 2013-04-20 21:22:13

0

如果你想选择一个节中的所有测试,那么你不应该使用或结类别的ID,而应使用连接这些表: 类似:

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

其中$section是的id部分你想选择测试。 您也可以指定要使用的列而不是*以仅选择您感兴趣的列。 $ section应该被转义以确保它不能被注入。

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

0

对特例使用特殊字符pipe symbole | 并做到这一点:

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

,并使用像条件:

SELECT * FROM测试,其中$海峡LIKE '%|' + CAST(类别为varchar)+ '|%' ORDER BY ID ASC

相关问题