问题描述
|
创建一个论坛类型的站点,我有3个表,一个表用于存储用户信息(用户),一个表用于原始帖子(线程),一个表用于类似SO的升级系统(投票)。
投票表包含3列,即id,userid和threadid。用户对主题进行投票时,会将记录插入投票表。当我查询线程时,我想知道用户是否对此进行了投票,实质上是在表决表中是否存在具有正确的userid和threadid的记录。我可以在两个查询中执行此操作,但是我认为必须有一种方法可以将所有内容合而为一。
我的查询当前:
\"SELECT t.id,t.title,t.content u.id AS uid,u.username
FROM threads t,users u
WHERE t.id = \'\".$userid.\"\'
AND t.author = \'\".$userid.\"\'\"
如果您需要更好的主意,则仅当用户投票时,以下内容才会查询所需的结果。如果表决表中的记录不存在,我需要查询仍然返回(可能将表决值返回为null?)。
\"SELECT t.id,t.content u.id
AS uid,u.username v.id
FROM threads t,users u,votes v
WHERE t.id = \'\".$threadid.\"\'
AND t.author = \'\".$userid.\"\'
AND v.threadid = t.id
AND v.userid = \'\".$userid.\"\'\"
我还自学(并且仍在学习)mysql和数据库设计,因此,如果有更好的方法/方法(如连接表),请告诉我。谢谢。
解决方法
您的第二个查询正在执行内部联接,该联接仅返回出现在联接两侧的记录。您想在表决表上进行左/右外部联接,这样即使没有匹配的表决记录,您仍然可以获得用户+线程记录。
SELECT t.id,t.title,t.content,u.id,u.username,v.id
FROM threads AS t
INNER JOIN users AS u ON t.userid = u.id
LEFT JOIN votes AS v ON (v.userid = u.id and t.id = v.threadid)
WHERE (u.id = $userid) AND (t.id = $threadid)
只是猜测一下,但足以让您入门。