2017-11-18 7 views
0

私はMySQLを使用しています。私は既にこれの重要な部分を担うクエリを持っています:同じテーブルから子 - 親の行を取得しています。行に基づいて異なる基準でソートする

テーブルcommentsから最新の親行を取得し、各親コメントについては、子供のコメントを取得し、最も古い順に並べ替えます。 注:parent_idという列があります。すべての親は0であり、もちろんすべての子供は0より大きい。 また、それは、列のソートされたがcreate_date

と呼ばれ、親と子供の両方が(1がASCだった、もう1つはDESCであっても)create_date、でソートされているので、これは非常になんとかでした。私はソートしたいので、注意すべき点は今

SELECT * FROM (
SELECT c1.*, c1.create_date ac, c1.create_date ap FROM comments c1 
WHERE parent_id = 0 AND c1.profile_id = 582 
UNION 
SELECT c2.*, c2.create_date ac, p.create_date ap FROM comments c2 
JOIN comments p ON c2.parent_id = p.id 
WHERE c2.profile_id = 582 
) c 
ORDER BY c.ap DESC, c.ac ASC; 

を:

今私は私がここでやっているようユーザーは「トップ」のコメントだけでなく、「最新」でソートするためのオプションを追加したいです両親はvotes(DESC)という列で、子ども(またはコメントの返信)は上記と同様にcreate_date ASCとなります。

私はORDER BYCASEのステートメントなどのサブクエストを試しました。このソートの変更には何が必要ですか?

注:パフォーマンスは素晴らしいですが、ここで最も大きな問題ではありません。また、私は外側のクエリを介してコード+ループを使用してこれを行うことができることを知っていますが、可能であればそのルートに行くのではありません。

+0

SELECT C1に新しいCASE文で使用されているソートするために親コメントのIDと親IDを追加する必要がありました*、c1.create_date交流、FROM c1.create_date APを。コメントc1 どこparent_id = 0とc1.profile_id = 582、この部分は何ですか?親コメントか子コメントですか?親コメントをどのように受け取っているのか分かりません。私は考えていた、あなたのような条件があります:コメントは親であることを示すためにcomment.id = 0 ...しかし、あなたのような継ぎ目は、コメントが親であることを示すcomment.parentId = 0を持っていますか? – Sarhang

+0

@Sarhangその部分はすべての親を得ます。共用体の下のSELECTは、子コメントを親に結合します。 – KickingLettuce

+1

@kickingLettues、私は間違っていたので私の答えを取り除きました。あなたは自分自身で答えを見つけました。 – Sarhang

答えて

1
SELECT * FROM 
(
    SELECT c1.*, c1.vote_count totals, c1.parent_id pa_id, c1.id p_id, c1.create_date ac, c1.create_date ap FROM comments c1 
    WHERE parent_id = 0 AND c1.profile_id = 582 
    UNION 
    SELECT c2.*, p.vote_count totals, p.parent_id pa_id, p.id p_id, c2.create_date ac, p.create_date ap FROM comments c2 
    JOIN comments p ON c2.parent_id = p.id 
    WHERE c2.profile_id = 582 
) c 
ORDER BY c.totals DESC, 
CASE 
    WHEN c.pa_id = 0 THEN c.p_id 
    ELSE c.parent_id 
END ASC, 
c.ac ASC 

私はちょうど新しいエイリアスの列を作り、彼らは一緒にソートされますので、基本的に子供に親の投票数を割り当て、そのtotalsと呼ばれます。

編集:私はまたORDER BY

関連する問題