我有以下表格,并希望从中查询另外一个元素。
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语法。
答案 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 . "'";