创建一个论坛类型的网站,我有3个表,一个用于存储用户信息(用户),一个用于原始帖子(线程),另一个用于像SO这样的upvote系统(投票)。
投票表有3列,id,userid和threadid。当用户提出一个线程时,会将一条记录插入到投票表中。当我查询该线程时,我想知道用户是否对它进行了投票,实际上如果在投票表中存在具有正确用户ID和线程的记录。我可以在两个查询中执行此操作,但我认为必须有一种方法可以将所有内容集中在一起。
我目前的查询:
"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."'"
如果您需要更好的想法,以下将仅在用户upvoted时查询所需的结果。如果投票表中的记录不存在(可能将投票值返回为空?),我还需要查询仍然返回。
"SELECT t.id, t.title, 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和数据库设计,所以如果有更好的方法/方法,如加入表格,请告诉我。感谢。
答案 0 :(得分:2)
您的第二个查询是执行内部联接,这只会返回出现在联接两侧的记录。您希望在投票表上执行左/右外连接,这样即使没有匹配的投票记录,您仍然可以获得用户+线程记录。
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)
只是猜测一下,但应该足以让你开始。