以下のテーブルにSQLクエリを書き込もうとしています。
╔════╦══════════╦═══════╗======╗======╗
║ ID ║ NAME ║ CLASS ║PARENT║ DOB ║
╠════╬══════════╬═══════╣======║======║
║ 1 ║ DAVID ║ SPIN ║ ║1 ║
║ 2 ║ AROON ║ BIKE ║ 1 ║1 ║
║ 3 ║ LEO ║ YOGA ║ ║2 ║
║ 4 ║ LIN ║ CYC ║ 1 ║2 ║
║ 5 ║ STEFA ║ YOGA ║ ║3 ║
║ 6 ║ GLORIA ║ RUNN ║ 1 ║3 ║
╚════╩══════════╩═══════╝======╝======╝
また、このテーブルの出力は次のようになります。
╔════╦════════╦═══════╗======╗======╗
║ ID ║ NAME ║ CLASS ║PARENT║ DOB ║
╠════╬════════╬═══════╣======║======║
║ 1 ║ DAVID ║ SPIN ║ ║1 ║
║ 2 ║ AROON ║ BIKE ║ 1 ║1 ║
║ 4 ║ LIN ║ CYC ║ 1 ║2 ║
║ 6 ║ GLORIA║ RUNN ║ 1 ║3 ║
║ 3 ║ LEO ║ YOGA ║ ║2 ║
║ 5 ║ STEFAN║ YOGA ║ ║3 ║
╚════╩════════╩═══════╝======╝======╝
So this is the explanation of the output
First parent David as his DOB is 1,
--David three childrens sorted based on DOB
Then LEO as his DOB is 2
-- Leo do not have children[if he did, would be here as sorted on DOB]
Then Stefan as his DOB is 3
-- Stefan do not have children [if he did, would be here as sorted on DOB]
だから私は何を試しましたか?
SELECT * FROM user group by ID, PARENT ;
SQLの上では、ステートメントは親子グループのアイテムを返しますが、順序を維持しません。追加するとORDER BY
、SQL
GROUPBYを尊重しているようには見えません。
次に、結合を実行して、2つの完全に異なるテーブルで終了しようとしました。一方にはすべての親が含まれ、もう一方にはすべての子が含まれています。UNION ALL
その2つのクエリで、期待されるデータセットが返されましたが、期待される順序ではありませんでした。
何かご意見は?
更新
Output should be
Pick entry [based on min time ].
--use that id and find all of its children and placed them in sorted order
repeat for every row in the table
注意:
--parents are sorted based on DOB
--child's are also sorted based on DOB
--DOB are valid timestamp
--PARENT, ID field both are UUID and define as CHAR, PARENT reference to ID
アップデート1
以下のクエリ
WITH RECURSIVE
top AS (
SELECT * FROM (SELECT * FROM user WHERE PARENT is null ORDER BY dob LIMIT 1)
UNION
SELECT user.NAME, user.PARENT, user.ID, user.CLASS, user.DOB FROM user, top WHERE user.PARENT=top.ID
ORDER BY user.dob
) SELECT * FROM top;
次の出力を返します:
╔════╦════════╦═══════╗======╗======╗
║ ID ║ NAME ║ CLASS ║PARENT║ DOB ║
╠════╬════════╬═══════╣======║======║
║ 1 ║ DAVID ║ SPIN ║ ║1 ║
║ 2 ║ AROON ║ BIKE ║ 1 ║1 ║
║ 4 ║ LIN ║ CYC ║ 1 ║2 ║
║ 5 ║ GLORIA║ RUNN ║ 1 ║3 ║
╚════╩════════╩═══════╝======╝======╝
出力は最初の親に適しています。しかし、それでも理解できませんでした。残りの親とその子を並べ替えた順序で繰り返すにはどうすればよいですか。
クエリ
SELECT u1.*
FROM `user` u1
LEFT JOIN `user` u2
ON u1.PARENT = u2.ID
ORDER BY CASE WHEN u1.PARENT IS NULL THEN u1.DOB ELSE u2.DOB END
|| CASE WHEN u1.PARENT IS NULL THEN '' ELSE u1.DOB END;
説明
u1
はすべてのユーザーの詳細がありますu2
は、該当する場合、親の詳細があります。(ALEFT JOIN
が使用されるためnull
、u1
ユーザーに親がいない場合、これらの詳細はすべてになります。)結果
以前に作成された値ORDER BY
(実際には必要ありませんSELECT
)は、ここの右端の列のようになります。
╔════╦════════╦═══════╗======╗======╦════════╗
║ ID ║ NAME ║ CLASS ║PARENT║ DOB ║ORDER BY║
╠════╬════════╬═══════╣======║======╬════════║
║ 1 ║ DAVID ║ SPIN ║ ║1 ║ 1 ║
║ 2 ║ AROON ║ BIKE ║ 1 ║1 ║ 11 ║
║ 4 ║ LIN ║ CYC ║ 1 ║2 ║ 12 ║
║ 6 ║ GLORIA║ RUNN ║ 1 ║3 ║ 13 ║
║ 3 ║ LEO ║ YOGA ║ ║2 ║ 2 ║
║ 5 ║ STEFAN║ YOGA ║ ║3 ║ 3 ║
╚════╩════════╩═══════╝======╝======╩════════╝
デモ
SQL FiddleDemoを参照してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加