order by子句中的参数不命令-mysql,C#

时间:2011-03-15 04:58:09

标签: mysql

在我的mvc应用程序中,我使用以下查询来选择一些数据。我没有使用存储过程

 select recordID,ChannelID,UserID ,StartTime ,Duration,SeqNum from result  WHERE SeqNum = ?pSeqNum
             ORDER BY StartTime  DESC limit ?pStartIndex, ?pRecordsPerPage;

我会将值传递给LIMT。它的工作正常。

现在我给了用户选择条件顺序的选项(用户从recordID,ChannelID,UserID,StartTime,Duration中选择一个)。 所以我试过以下代码。

 select recordID,ChannelID,UserID ,StartTime ,Duration,SeqNum from result  WHERE SeqNum = ?pSeqNum
             ORDER BY ?pOrderBy  DESC limit ?pStartIndex, ?pRecordsPerPage;

当我传递给pStartIndex和pRecordsPerPage时,我传递了pOrderBy的值。 但它不工作的顺序。它只能通过

选择没有订单的数据

3 个答案:

答案 0 :(得分:3)

这是因为ORDER BY使用数据库标识符(即列,别名或表达式)。您将该值作为参数传递。

换句话说,生成的查询将等同于

... ORDER BY 'StartTime' ...

如果根据已知的一组值(即可用列)验证用户输入,则可以简单地将值插入查询字符串,例如(非常粗略)

$orderBy = $_GET['order_by'];
if (!in_array($orderBy, $orderableColumns)) {
    throw new Exception('Invalid "order by" specified');
}
$query = sprintf('... ORDER BY `%s` ...', $orderBy);

答案 1 :(得分:2)

我不相信order by子句可以参数化。绝对不是在Oracle中,不是100%肯定MySQL。

答案 2 :(得分:0)

您可以根据参数使用new Cesium.PositionPropertyArray([])条件来SELECT排序列,为其命名,然后按该列排序。

CASE WHEN

我们将在结果中增加一列,但我认为它不会从索引列中受益,这会降低查询速度,但它可以工作。