我有两个表:学生和家长,处于单亲对多学生的关系。两者都有一个parentID。 parent 表用作我的登录名。它有家长 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的顺序返回数据。我已经搜索了一个多小时寻找解决方案,但一无所获。感谢您提供的任何帮助。
最佳答案
你可以尝试这样的事情:
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。
关于MySQL order by 在从两个表中选择时被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17538997/