在从两个表中选择时忽略MySQL order by

在从两个表中选择时忽略MySQL order by,mysql,sql-order-by,Mysql,Sql Order By,我有两张桌子:学生和家长,在一个家长对多个学生的关系。两者都有parentID。父表用作我的登录名。它有父ID、名称、电子邮件地址和密码。学生们有很多领域。我需要选择所有家长并包括他们学生的名字(这部分很好)。我希望能够通过家长姓名或家长电子邮件订购。但是,我的ORDERBY语句将被忽略,$rows是按parentID排序的。这是我的密码: $query = 'SELECT Parents.parentID, Parents.parentName, Parents.Email,

我有两张桌子:学生和家长,在一个家长对多个学生的关系。两者都有parentID。父表用作我的登录名。它有父ID、名称、电子邮件地址和密码。学生们有很多领域。我需要选择所有家长并包括他们学生的名字(这部分很好)。我希望能够通过家长姓名或家长电子邮件订购。但是,我的ORDERBY语句将被忽略,$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之间。

不能在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" ;
这将正确的字段名直接放入查询中,一切正常。

可能是因为它在道德上等同于按“常量字符串”排序的
,所以
orderby
子句将所有行视为相等。我们明天将尝试此方法。不知道你的意思是什么:道德上等同于“常量字符串”的顺序。@WynSnow-我的意思是,你尝试的与用“a”编写
顺序差不多。
-它不会有任何效果,因为它是一个字符串,而不是一列的名称-所以每一行的排序过程都有相同的值。实际上没有,这是一列的名称。我在其他地方找到了解决方案:基本上,不能在ORDERBY子句中使用变量。必须直接构造查询。如下所示:if($condA){$orderby='field_name'};elseif($condB){$orderby='field_email'}$query=“按$orderby从表中选择字段名”;这将直接向查询中插入正确的$orderby变量,一切正常。@WynSnow-您有一个字符串碰巧包含了一个列的名称。如果您有
$var=“1+2”
在您的(PHP?)代码中,您是否希望
$var
等于
3
?好的,显然我不理解“包含列名称的字符串”和列的实际名称之间的区别。顺便说一句,我尝试了你的案例建议,但这对我也不起作用。构造$query确实有效。