2017-05-04 121 views
1

爲了創建顯示嵌套註釋的高效方法,我希望可以對一個查詢進行操作。嵌套註釋的單個查詢

簡體評語表

CREATE TABLE comment (
comment_id int unsigned primary key auto_increment, 
date int unsigned, 
parent_id int unsigned, 
comment text); 

爲了澄清,評論是由date ASC進行排序。如果評論的parent_id不爲空,那意味着它是嵌套註釋。這parent_id是指所述評論的父母comment_id

後面的部分是我有困難的地方。任何人都可以幫我拿出一個單一的MySQL查詢來做到這一點嗎?

謝謝

回答

1

下面的代碼應該照顧到以高效的方式你的第二個需要:

CREATE TABLE comment(
comment_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
date INT UNSIGNED, 
parent_id INT UNSIGNED DEFAULT NULL, 
commend TEXT, 
FOREIGN KEY fk_parent(parent_id) 
REFERENCES comment(comment_id) 
ON UPDATE CASCADE 
ON DELETE RESTRICT) 

你只是想確保兒童的評論是不是因爲一個父評論之前插入外鍵引用。

但是,當涉及到按日期對錶進行排序時,MySQL CREATE TABLE語法不包含這樣的功能,我認爲有效的實現是在查詢時簡單地使用ORDER BY。但請記住,如果您確實選擇在日後更改表格並在日期前訂購,則此更改後的任何操作都不符合此訂單。具體來說:

ALTER TABLE comment ORDER BY date ASC 

只會對您的表格中的當前數據進行排序而不會輸入任何後續數據。

此外,根據您的要求,考慮使用DATE數據類型而不是int。

+0

謝謝,我很欣賞這個答覆。不幸的是,我不熟悉使用FOREIGN KEY和這樣做的影響(影響我對錶格/大小/效率/不相關的查詢),並且需要更多時間來研究這些考慮因素。我希望有一些方法可以在不使用其他方法的情況下在單個查詢中完成此操作。我可以問問,如果您認爲這是一種解決方案,或者是所有可能解決方案中最有效的解決方案?再次感謝你。 – Bogdan

+1

一個外鍵在你的代碼中僅僅保證父數據庫中存在父註釋。當您想要查找所述父註釋時,還可以更輕鬆地查詢。至於排序,只要你索引日期列,我不認爲你需要訴諸ALTER TABLE,因爲查詢時的排序應該便宜。但總的來說,理解數據庫的索引和約束以便進行有效的管理是非常好的。希望這有助於! – YashTD