2011-06-29 6 views
1
SELECT * 
    FROM myTable m 
WHERE m.userId = :userId 
    AND m.X = (SELECT MAX(X) 
       FROM myTable m 
       WHERE m.userId = :userId 
       AND m.contactNumber = :contactNumber)"; 

問題は、このような行がなく、実行が失敗した場合にステートメントの第2部がNULLと評価されることです。そのような場合は結果を空にします。サブクエリでnullを処理する

この問題を解決する1つの方法は、高価なfilesort(order by)を実行し、コードレベルで必要なフィールドをフェッチすることです。この問題の解決策はありますか?

答えて

2

ISNULLを使用できますか?

とMX = ISNULL( '')

+0

私の悪いところは、IFNULL(mysqlとhibernateのSQLサーバのISNULLに相当)について知りませんでした。だから、X =(IFNULL(max(X)、 ''を選んで) – r15habh

0

私はあなたがここにNULLを取得している理由はわからないんだけど、この試してください:あなたは、パフォーマンスを懸念している場合は

SELECT myTable.*, IF myTableMax.myMaxX IS NOT NULL myTableMax.myMaxX ELSE "" 
    FROM myTable 
LEFT OUTER JOIN 
     (SELECT userID, contactNumber, MAX(X) AS myMaxX 
      FROM myTable 
     GROUP BY userID, contactNumber) AS myTableMax 
    ON myTable.userID = myTableMax.userID 
    AND myTable.contactNumber = myTableMax.contactNumber 
WHERE myTable.userID = :userID 
    AND myTable.contactNumber = :contactNumber 

を追加インデックスはmytable (userID, contactNumber)です。

関連する問題