MySql如果记录存在于Select Query中

时间:2011-05-25 02:08:25

标签: php mysql database-design

创建一个论坛类型的网站,我有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和数据库设计,所以如果有更好的方法/方法,如加入表格,请告诉我。感谢。

1 个答案:

答案 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)

只是猜测一下,但应该足以让你开始。