1

created_at行が挿入されたときに表すタイムスタンプである、という名前のフィールドを持つテーブルがいくつかあります。

今、私は永続層としてmybatis 3を使用していますが、で何かをクエリすると少し退屈であることがわかりましたjoin

私がすべての質問とその答えを得ると期待した単純なSQLを見てください:

<select id="selectQuestionsWithAnswers">
      select q.*, a.* from questions as q left inner join answers as a
             on q.id=a.id
      order by a.created_at desc
</select>

しかしquestionsanswers両方にフィー​​ルドがあるため、結果セットに2が含まれているcreated_atことがわかりました。また、2番目のフィールドは無視されます。したがって、回答の値は、正しくありません。select q.*, a.*created_atcreated_atquestions

これを避けるために、私は2つの方法を見つけましたが、どちらも良くありません。

  1. 各テーブルのフィールド名を変更し、それらが同じでないことを確認します。例:questions.created_at-> questions.q_created_atanswers.created_at-> answers.a_created_at

    id、、、などのフィールドがたくさんあるため、これは良くありませんname。データベースを読みにくくし、これらの名前を変更するために維持するのが難しくなりますtitleupdated_at

  2. SQLを変更します。次のように、SQLのフィールド名を変更します。

    select q.id as q_id, q.title as q_title, ..., q.created_at as q_created_at, 
           a.id as a_id, a.content as a_content, ..., a.created_at as a_created_at
    from questions as q left inner join answers as a
           on q.id=a.id
    order by a.created_at desc
    

    SQLのすべてのフィールド名を変更する必要があるため、これは良くありません。非常に長くて読みにくくなり、そのようなSQLを毎回書くのは面倒です。

私はmybatisを初めて使用しますが、この問題に対するより良い解決策はありますか?

4

1 に答える 1

2

どうですか

<select id="selectQuestionsWithAnswers">
      select q.*, a.*, q.created_at as qtime, a.created_at as atime from questions as q left inner join answers as a
             on q.id=a.id
      order by atime desc
</select>

今、あなたはあなたの時間を持っているでしょうatimeそしてqtime

于 2011-08-15T05:23:10.363 に答える