查看完整版本 : SQL 複雜關係查詢

AssLicker 2019-4-18 20:33

Table thread:
t_id INT NOT NULL,
title VARCHAR,
content VARCHAR,
author_id INT NOT NULL,
lastRepliedUser_id INT NOT NULL,
FOREIGN KEY (author_id) REFERENCES `user` (u_id),
FOREIGN KEY (lastRepliedUser_id) REFERENCES `user` (u_id),
PRIMARY KEY(t_id)

Table user:
u_id INT NOT NULL,
username VARCHAR NOT NULL,
PRIMARY KEY(u_id)

宜家我要同時查詢所有主題帖,發帖者username同埋最後一個回複用戶既username,應該點寫?

111x111=12321 2019-4-18 21:19

[quote]原帖由 [i]AssLicker[/i] 於 2019-4-18 08:33 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=498007266&ptid=28166119][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
SQL 複雜關係查詢
... [/quote]

唔係好複雜姐~

入門級, 你先做左幾多得幾多.:smile_34:

sshare 2019-4-19 10:04

咁叫複習 及早轉行吧

fx360bx 2019-4-21 22:50

LEFT JOIN user table 兩次咪得。
我係你就唔會放 lastRepliedUser_id 喺 thread table 度。

[[i] 本帖最後由 fx360bx 於 2019-4-21 10:52 PM 編輯 [/i]]

EURORIDER 2019-4-22 20:46

SELECT
t.t_id,
t.title,
t.content,
t.author_id,
u1.username AS authorUserName,
t.lastRepliedUser_id,
u2.username AS lastRepliedUserName
FROM thread t
        LEFT JOIN user u1
        ON t.author_id = u1.u_id
        LEFT JOIN user u2
        ON t.lastRepliedUser_id = u2.u_id 

111x111=12321 2019-4-23 16:28

兩位好似唔係完全正確喎.:o

帖KEYWORD係查詢,
故此不是要求另造一個表.

111x111=12321 2019-4-23 16:30

I.e. 樓主的「發帖者username and 最後一個回複用戶既username」,
let them be name1 and name2

大概係...
select .... from .. t1, .. t2, .. t3 where ..(key_matching).. and ..=name1 and ..=name2

.     OR    .

select .... from ...(join_tables_on_id).. where ..=name1 and ..=name2

form5 2019-4-23 23:19

table 吾俾冇回覆,又冇 time stamp  去比較前後関系,講就易做囉...

路寅甲 2019-4-24 15:09

Table Thread設計上冇顧及到某些post可能冇reply :smile_24:


有條link解析一個同本貼類同, 簡單又易驗證嘅例子, 附帶驗證用sql碼, 一個inner join加一個left join, 實質相當於#5 ching嗰個double left join寫法
[url]https://element121.com/2015/11/07/how-to-join-the-same-table-twice-in-a-single-sql-query-statement/[/url]

111x111=12321 2019-4-24 15:32

帖無時日印記的確係奇怪設計,
未有人覆咪天生'嬲'囉, 無問題格.

howevera 2019-4-25 09:30

咁樣要 set 返 lastRepliedUser_id 可以 null.

[quote]原帖由 [i]路寅甲[/i] 於 2019-4-24 03:09 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=498275899&ptid=28166119][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Table Thread設計上冇顧及到某些post可能冇reply :smile_24:


有條link解析一個同本貼類同, 簡單又易驗證嘅例子, 附帶驗證用sql碼, 一個inner join加一個left join, 實質相當於#5 ching嗰個double left join寫法
[url=https://element121.com/2015/11/07/how-to-join]https://element121.com/2015/11/07/how-to-join[/url] ... [/quote]

路寅甲 2019-4-26 16:39

[quote]原帖由 [i]howevera[/i] 於 2019-4-25 09:30 AM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=498315866&ptid=28166119][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
咁樣要 set 返 lastRepliedUser_id 可以 null.

[/quote]

係囉, 冇必要加NOT NULL, 每次新開POST都要加個多餘數字入去代表冇reply, 及後有關queries又要記住呢個數字等於冇嘢

form5 2019-4-26 22:14

本來的設計算差,用 table id 去代表不同意思,更加差,最後 business logic 放入 sql 或 SP,  code 又要 handle, UI 又要 特別 handle. 改少少business logic, 要改幾多地方呢

bickey 2019-5-10 16:52

圖1, user 的內容
圖2, thread 的內容
圖3, 用group by parent_id, 同找出最後回的帖,同改名為 max(created_at) last_modified_at
圖4, 用上述的, 加上 author_id 同改名為 author_id > last_author_id, parent_id > last_thread_id
圖5, 用 left join 將剛完成的同 thread 加起來, 因為可能有主帖,但無人回,如 record 8。
頁: [1]
查看完整版本: SQL 複雜關係查詢