2014-11-06 79 views
2

我有下面的表格,想从中查询一个元素。SQL Query JOIN语法

categories table ->idcat(int), cat(varchar); 
topics table  ->idtopic(int), topic(varchar), idcat(int-fk), iduser(int-fk); 
replies table ->idreply(int), reply(varchar) iduser(int-fk), idtopic(int-fk) 
users table  ->iduser(int), username(varchar). 

我目前的查询是;

$query = "SELECT t.topic, t.idtopic, u.username 
    FROM topics t 
    LEFT JOIN categories c ON t.idcat = c.idcat 
    LEFT JOIN users u ON t.iduser = u.iduser 
    WHERE c.idcat = '" . $idcat . "'"; 

其中显示'主题'和'用户名'。我想显示'idReply',但不知道正确的JOIN语法。

+1

对于每个主题,“答复”中是否不会有多个字段? – 2014-11-06 20:36:36

+0

我想可能会有这个表格结构。所以你有可能用新的连接返回多行。 – Henry 2014-11-06 20:45:29

回答

0

您的topics表必须具有reply_id(外键)。之后,您可以使用此查询。

$query = "SELECT t.topic, t.idtopic, u.username, r.id as reply_id 
      FROM topics t 
      LEFT JOIN categories c ON t.idcat = c.idcat 
      LEFT JOIN users u ON t.iduser = u.iduser 
      LEFT JOIN replies r ON t.reply_id = r.id 
      WHERE c.idcat = '" . $idcat . "'"; 
+0

虽然这可能在技术上有用,但我认为它不会对OP有所帮助。看起来你需要/想要对每个主题有多个回复,所以最好在回复表中加入fk,然后加入:'LEFT JOIN回复r ON r.idtopic = t.idtopic' – mason81 2014-11-06 20:41:23

+1

主题表上的'reply_id'将强制主题和回复之间的1:1关系。事实上,这可能是需要的。如果是这样的话,'reply_id'将是合适的,否则看看我的答案。 – Henry 2014-11-06 20:47:30

1
SELECT 
    t.topic, 
    t.idtopic, 
    u.username 
FROM 
    topics t 
LEFT JOIN 
    categories c ON t.idcat = c.idcat 
LEFT JOIN 
    users u ON t.iduser = u.iduser 
LEFT JOIN // new 
    replies r ON r.iduser = u.iduser AND r.idtopic = t.idtopic // new 
WHERE c.idcat = '" . $idcat . "'"; 

,这将产生在指定类别的每个回复每一个主题行。这可能是很多记录。

您可能还想在回复表上试验加入的确切类型以获得您想要的结果。左连接可能是正确的,因为如果没有给定主题的回复,你仍然会得到结果。这可能取决于你的SQL风格。

OUTER JOIN & LEFT OUTER JOIN是可能性。

使用INNER JOIN将确保只返回有回复的主题。

+0

可能会在select子句中加入'r.idreply,r.reply'? – mason81 2014-11-06 20:44:25

+1

这可能很有用。您可以使用此连接从4个表中添加任何字段。 – Henry 2014-11-06 20:48:58