3

MySQL の SELECT クエリで少し問題が発生しています。いくつかのポインタに感謝します。既存の回答を教えてください(回答があり、それを見逃した場合)。

クエリは現在次のとおりです。

SELECT e.*, ie.aaa, ue.bbb, ue.ccc
FROM ie
LEFT JOIN e ON ie.e_id = e.e_id
LEFT JOIN ue ON ie.e_id = ue.e_id
WHERE ie.other_id = ? AND ue.unrelated_id = ?
ORDER BY ...

eueの3 つのテーブルがあります

テーブルieueeの関係であるため、外部キー (e_id) を含みます。? 入力パラメータを表します。

問題はue.unrelated_id = ? 部。ここで本当にやろうとしていることは次のとおりです

  • unrelated_id = ? の ue 関係がある場合にのみ ue.ccc を返します。存在しない場合は、このフィールドを null にします。
  • unrelated_id = ? 存在しない場合、このクエリは常に残りのフィールドを返す必要があります (つまり、other_id = ? に対して存在することが保証されています)。

残念ながら、この where 句を削除すると、「ランダムな」unrelated_id の ue.ccc が取得されます。しかし、そのままにしておくと、この unrelated_id の ue が存在しない場合、クエリはまったく結果を返しません。OR ue.unrelated_id IS NOT NULL も追加しようとしましたが、これにより、ue テーブルが空の場合、クエリは結果を返しません。

何か案は?さらに明確にする必要がある場合は、コメントを残してください。数時間以内に迅速に回答する必要があります。

4

1 に答える 1

8

次の 2 つのいずれかを行うことができます。

SELECT e.*, ie.aaa, ue.bbb, ue.ccc
FROM ie
LEFT JOIN e ON ie.e_id = e.e_id
LEFT JOIN ue ON ie.e_id = ue.e_id AND ue.unrelated_id = ?
WHERE ie.other_id = ? 
ORDER BY ...

または

SELECT e.*, ie.aaa, ue.bbb, ue.ccc
FROM ie
LEFT JOIN e ON ie.e_id = e.e_id
LEFT JOIN ue ON ie.e_id = ue.e_id
WHERE ie.other_id = ? AND (ue.unrelated_id IS NULL OR ue.unrelated_id = ?)
ORDER BY ...

ただし、最初のクエリを使用します。

ue.unrelated_id編集: 2 番目のクエリは、null 許容列でない場合にのみ適切であることに注意してください。

于 2012-08-10T17:55:36.203 に答える