同时连接几个表:

问题描述:

我使用下面的SQL语句:同时连接几个表:

SELECT reply.id, reply.content, author.username 
FROM thread, reply, author 
JOIN thread_reply ON thread.id = thread_reply.thread_id 
JOIN reply ON thread_reply.reply_id = reply.id 
JOIN author_reply ON thread.id = author_reply.thread_id 
JOIN author ON author_reply.author_id = author.id 
WHERE thread.id = '40' 

我有follwing表:

thread_reply: thread_id, reply_id 

reply: id, content, created (timestamp) 

author: id, username, password_hash, salt #etc 

thread: id, content, created 

author_reply: author_id, reply_id 

我不断收到以下错误:

#1066 - Not unique table/alias: 'reply' 

哦,我正在使用MySQL。

+1

你不应该明确从'reply'选择和'author'如果你要加入他们的行列。 – 2011-04-01 14:18:15

+0

我的头痛... – 2011-04-01 14:22:56

+1

'thread_reply'和'author_reply'表有什么意义?一个回复可以引用多个线程吗?一个答复可以有多个作者吗? – Quassnoi 2011-04-01 14:31:40

SELECT reply.id, reply.content, author.username 
FROM thread 
INNER JOIN thread_reply ON thread.id = thread_reply.thread_id 
INNER JOIN reply ON thread_reply.reply_id = reply.id 
INNER JOIN author_reply ON thread.id = author_reply.thread_id 
INNER JOIN author ON author_reply.author_id = author.id 
WHERE thread.id = '40' 
+0

没有author_reply.thread_id – 2011-04-01 14:29:38

+0

你是对的,它应该是INNER JOIN author_reply ON reply.id = author_reply.reply_id – dcarneiro 2011-04-01 14:39:10

+0

我选择了这个,因为它帮助找到正确的答案 – 2011-04-01 14:44:48

你有一个隐含的CROSS JOINreply之间threadauthor原始查询,并且加入第二次相同的表不走样他们。

使用此:

SELECT reply.id, reply.content, author.username 
FROM thread t 
JOIN thread_reply tr 
ON  tr.thread_id = t.id 
JOIN reply r 
ON  r.id = tr.reply_id 
JOIN author_reply ar 
ON  ar.reply_id = r.id 
JOIN author a 
ON  a.id = ar.author_id 
WHERE thread.id = '40' 

要包括的FROM子句中的表,然后加入到他们以及 - 我想你想简单地FROM thread,然后你的加入。

你,说

JOIN author_reply ON thread.id = author_reply.thread_id 

有根据给出的定义在author_reply表中没有thread_id,则该行得到了一个错误。

这工作:

SELECT reply.id, reply.content, author.username 
FROM thread 
JOIN thread_reply ON thread.id = thread_reply.thread_id 
JOIN reply ON thread_reply.reply_id = reply.id 
JOIN author_reply ON reply.id = author_reply.reply_id 
JOIN author ON author_reply.author_id = author.id 
WHERE thread.id = '40'