0

私は 2 つのテーブルを持っています: 1 人の親と多くの学生の関係で、学生と親です。両方とも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 の順序でデータを返します。解決策を探して1時間以上検索しましたが、何も見つかりませんでした。ご協力いただきありがとうございます。

4

2 に答える 2

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式の結果は、単一の型である必要があるか、単一の型に変換できる必要があるため、数値を強制的に文字列として比較したくないため、1 と 2 の間に 10 を配置します。

于 2013-07-09T06:02:31.780 に答える
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 に答える