2011-05-25 54 views
0

创建一个论坛型网站,我有3个表,一个用于存储用户信息(用户),一个用于原始帖子(线程),另一个用于像SO这样的upvote系统(票)。MySql如果记录存在内部选择查询

投票表有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."'" 

如果你需要一个更好的主意,下面将查询所需的结果只有当用户已经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和数据库设计,所以如果有一个更好的方法/方法,如连接表,请让我知道。谢谢。

回答

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) 

只是猜测在这,但应该足以让你开始。