SQL Query JOIN语法

时间:2014-11-06 20:31:33

标签: php mysql 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语法。

2 个答案:

答案 0 :(得分: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 . "'";

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

您可能还想在回复表上试验确切的联接类型,以获得所需的结果。 LEFT JOIN可能是正确的,因为如果没有对给定主题的回复,您仍会得到结果。这可能取决于您的SQL风格。

OUTER JOIN& LEFT OUTER JOIN是可能性。

使用INNER JOIN将确保仅返回包含回复的主题。

答案 1 :(得分:0)

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

$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 . "'";