减少仅在ORDER BY字段名称不同的mysql语句

时间:2009-11-06 19:33:25

标签: php mysql database pdo

我正在尝试按升序和降序的不同字段对数据进行排序。但是我有4个字段的不同mysql pdo语句(总共8个查询):

$stmt1 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 DESC");
$stmt2 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 ASC");
$stmt3 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field2 DESC");
$stmt4 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC");
$stmt5 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 DESC");
$stmt6 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC");
$stmt7 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 DESC");
$stmt8 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 ASC");

根据输入,我选择正确的语句并绑定并执行它。

if ($sortcode == 1){ 
   $stmt1->bindParam(':categ', $categ, PDO::PARAM_STR);
   $stmt1->execute();
   $fetched = $stmt1->fetchAll(PDO::FETCH_ASSOC);
} else if ($sortcode == 2){
   $stmt2->bindParam(':categ', $categ, PDO::PARAM_STR);
   $stmt2->execute();
   $fetched = $stmt2->fetchAll(PDO::FETCH_ASSOC);
} else if ($sortcode == 3){
   $stmt3->bindParam(':categ', $categ, PDO::PARAM_STR);
   $stmt3->execute();
   $fetched = $stmt3->fetchAll(PDO::FETCH_ASSOC);
}
//repeat the block 5 more times, for a total of 8

这看起来并不正确。由于select语句只是字段名称和desc / asc不同,有没有更好的方法来获取$sortcode并压缩后面的代码?

我想我可以更具体地说明这个问题:我有没有办法让一个语句/单个pdo语句动态绑定字段名称和asc / decs?

3 个答案:

答案 0 :(得分:4)

使用关联数组来保存预准备语句。

您的输入是一个列和一个排序方法,对吗?因此,请通过以下方式准备查询:

$columns = array("field1", "field2", "field3", "field4");
$orders = array("asc", "desc");
$queries = array();
foreach($columns as $col) {
  $queries[$column] = array();
  foreach ($orders as $order) {
     $queries[$column][$order] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order");
  }
}

现在,要查找正确的查询,您不需要一些合成代码 - 您只需按列查找并直接订购。

要查找查询,请让用户输入一个列和一个订单,而不是让用户输入1-8中的数字。想象一下,该列位于变量$ col中,订单位于$ ord中。只要说$ queries [$ col] [$ ord]。

如果由于某种原因你必须使用这个数字(为什么?),那么你需要一个稍微不同的策略。在这种情况下,您可以按该号码存储查询

$columns = array("field1", "field2", "field3", "field4");
$orders = array("asc", "desc");
$queries = array();
$i = 0;
foreach($columns as $col) {
  foreach ($orders as $order) {
     $i = $i + 1;
     $queries[$i] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order");
  }
}

换句话说,您应该根据计划查找的方式存储查询。

答案 1 :(得分:1)

您可以按列号排序,可以参数化。如果在select子句中指定列,则以这种方式使用ORDER BY通常更清晰。我不确定ASC / DESC是否可以参数化,但是......

答案 2 :(得分:0)

您始终可以动态构建查询。将地图存储在$sortcode和列之间,SELECT * FROM tabname WHERE categ=:categ部分,根据$sortcode获取正确的列名称并添加ORDER BY ...部分。