2013-09-01 72 views
1

我期待着类似的问题,但我没有找到正确的语法。用MySQL连接四个表并从两个表中获取值

我有这些表:

行情 - quotes_id - AUTHOR_ID - quote_ENG

作者 - AUTHOR_ID - 作者

TopicMap - topicmap_id - topics_ENG

QuotesByTopic - quotes_id - topicmap_id

我需要从表行情,从表作者的作者“WHERE 'topic_ENG'= '年龄' 得到 'quote_ENG'。

我能够得到 'quote_ENG' 值...:

SELECT quote_ENG 
FROM Quotes, TopicMap, QuotesByTopic 
WHERE TopicMap.topics_ENG='age' 
    and QuotesByTopic.topicmap_id = TopicMap.topicmap_id 
    and QuotesByTopic.quotes_id = Quotes.quotes_id 

...但我错过了最后一段也得到了 '作者' 值:

​​

谢谢你的任何帮助

+4

显式'JOIN'语法是你的朋友。 – Kermit

+0

您正在使用超过20年过时的JOIN语法,[本文](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using -old-style-joins.aspx)突出了许多原因来切换到新的ANSI 92 JOIN语法 – GarethD

回答

3

试试这个:

SELECT 
    q.quote_ENG, 
    a.author 
FROM QuotesByTopic AS qt 
INNER JOIN TopicMap AS t ON qt.topicmap_id = t.topicmap_id 
INNER JOIN Quotes AS q ON qt.quotes_id = q.quotes_id 
INNER JOIN Authors AS a ON a.author_id = q.author_id 
WHERE t.topics_ENG = 'age' 
+0

我试图使用它,但不幸的是它似乎不起作用。它不会给我一个错误,因为它永不停止加载。这就像它被限制在一个无限循环中 –

+0

@fabrizio_ff - 它与你所做的一样,但语法不同,它应该工作正常,你可能需要使用'LEFT JOIN'来代替。它在那之后工作得很好,还是永不止步? –

+0

它可以工作,但需要几分钟才能得到结果。它可能取决于数据库的大小?这些表格包括:作者(17.400条记录),行情(70.000条记录),QuotesByTopic(70.000条记录),TopicMap(100条记录)。 –

0

编辑:你改变了你的问题,因为我正在打字...我仍然使用一个独特的事情,你想做类似tma.topics_ENG IN('年龄','性别')。正如其他人显示我会使用显式连接。包括你自己在内的每个人都可以更轻松地阅读和理解。

SELECT DISTINCT 
     ath.author, 
     qts.quote_ENG 
FROM quotes qts 
INNER JOIN Authors ath 
    ON qts.author_id = ath.author_id 
INNER JOIN QuotesByTopic qbt 
    ON qts.quote_id = qbt.quote_id 
INNER JOIN TopicMap tma 
    ON qbt.topicmap_id = tma.topicmap_id 
WHERE tma.topics_ENG = 'age'; 
相关问题