Tôi đang cố gắng viết một truy vấn sql trên bảng dưới đây.Truy vấn SQL cho mối quan hệ cha mẹ con
╔════╦══════════╦═══════╗======╗======╗
║ 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 ║
╚════╩══════════╩═══════╝======╝======╝
Và, đầu ra cho bảng này nên được như sau
╔════╦════════╦═══════╗======╗======╗
║ 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]
Vì vậy, những gì tôi đã cố gắng?
SELECT * FROM user group by ID, PARENT ;
Trên SQL, các mục tuyên bố trở lại trong cha mẹ trẻ nhóm nhưng không phải không duy trì bất kỳ thứ tự, khi tôi thêm ORDER BY
, SQL
không có vẻ như tôn vinh GROUP BY nữa.
Sau đó, tôi đã cố gắng để tham gia và kết thúc với hai bảng hoàn chỉnh khác nhau, nơi một chứa tất cả các bậc cha mẹ và một số khác có chứa tất cả trẻ em. UNION ALL
trên hai truy vấn đó đã trả về bộ dữ liệu dự kiến nhưng không phải theo thứ tự mong muốn.
Mọi suy nghĩ?
CẬP NHẬT
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
Lưu ý:
--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
Cập nhật 1
Query rống lên
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;
trở về sau đầu ra:
╔════╦════════╦═══════╗======╗======╗
║ ID ║ NAME ║ CLASS ║PARENT║ DOB ║
╠════╬════════╬═══════╣======║======║
║ 1 ║ DAVID ║ SPIN ║ ║1 ║
║ 2 ║ AROON ║ BIKE ║ 1 ║1 ║
║ 4 ║ LIN ║ CYC ║ 1 ║2 ║
║ 5 ║ GLORIA║ RUNN ║ 1 ║3 ║
╚════╩════════╩═══════╝======╝======╝
Output là tốt cho cha mẹ đầu tiên. Nhưng, vẫn không thể tìm ra, làm thế nào tôi có thể lặp lại thông qua phần còn lại của cha mẹ và con cái của họ theo thứ tự sắp xếp.
Đầu ra trông giống như đầu vào. Chuyện gì đang xảy ra ở đây? –
không chỉ rechecked ra đặt là khác nhau sau đó trong đặt. – minhaz
Sự khác biệt duy nhất tôi thấy là thứ tự. Tôi cũng không điên về việc sử dụng 'SELECT *' với một 'GROUP BY'. –