0

我有两张表:学生和家长,一对多的学生关系。两者都有一个 parentID。父母表用作我的登录名。它有家长 ID、姓名、电子邮件地址和密码。学生有很多领域。我需要选择所有父母并包括他们学生的姓名(这部分工作正常)。我希望能够通过父母姓名或父母电子邮件进行订购。但是,我的 order by 语句被忽略了,$rows 是按 parentID 排序的。这是我的代码:

$query = 'SELECT 
  Parents.parentID, 
  Parents.parentName, 
  Parents.Email, 
  Students.nickName,
  Students.Lname
FROM Parents, Students
WHERE Parents.parentID=Students.parentID
  AND Parents.status=:active
ORDER BY :orderby ASC' ;
$stmt = $db->prepare($query);
$stmt->bindValue(':orderby', $myOrderby, PDO::PARAM_STR);
$stmt->bindValue(':active', 'active', PDO::PARAM_STR);

我努力了

$myOrderby = 'parentName' ;
$myOrderby = 'Parents.parentName' ;
$myOrderby = 'Email' ;
$myOrderby = 'Parents.Email' ;

(是的,在查询上方)并且结果是一样的:它按 parentID 的顺序返回数据。我已经搜索了一个多小时寻找解决方案,但一无所获。感谢您提供的任何帮助。

4

2 回答 2

0

不能在 ORDER BY 子句中使用变量。必须构建实际的查询。像这样:

if ($conditionA) { $orderby = 'field_name' } ;
elseif ($condiB) { $orderby = 'field_email' } ;
else             { $orderby = 'field_default' } ;

$query = "SELECT fieldnames FROM tables WHERE whatever ORDER BY $orderby" ;

它将正确的字段名直接放入查询中,一切都很好。耶!

于 2013-07-17T20:58:53.767 回答
0

你可以尝试这样的事情:

SELECT 
  Parents.parentID, 
  Parents.parentName, 
  Parents.Email, 
  Students.nickName,
  Students.Lname
FROM Parents, Students
WHERE Parents.parentID=Students.parentID
  AND Parents.status=:active
ORDER BY
    CASE :orderby
       WHEN 'Name' THEN Parents.parentName
       WHEN 'EMail' THEN Parents.Email
    END ASC

然后设置$myOrderby'Name''EMail'

您可以将其扩展到更多列,前提是所有列都具有相同的数据类型。如果您有混合的字符串和数字数据来进行排序,那么您将改为:

ORDER BY
    CASE :orderby
       WHEN 'Name' THEN Parents.parentName
       WHEN 'EMail' THEN Parents.Email
    END ASC,
    CASE :orderby
       WHEN 'NumericColumn' THEN NumericColumn
    END

因为每个CASE表达式的结果必须是或可转换为单一类型 - 并且您不希望强制将数值作为字符串进行比较 - 将 10 置于 1 和 2 之间。

于 2013-07-09T06:02:31.780 回答