我有2张桌子。一个表包含帖子,另一个表包含帖子的投票。每个成员都可以为每个帖子投票(+或 - )。 (结构示例:)
还有一个表,其中包含用户的信息。
我想要的是:假设我是登录成员。我想展示所有帖子,而那些我已经投票的帖子,不要让我再次投票。 (并告诉我我投了什么+或 - )
我现在所做的非常糟糕,因为它会进行大量查询:
SELECT `posts`.*, `users`.`username`
FROM `posts`,`users`
WHERE `posts`.belongs=$taken_from_url AND `users`.`usernumber`=`posts`.`userp`
ORDER BY `posts`.`pid` DESC;
然后:
foreach ($query as $result) {if (logged_in) {select vote from votes....etc} }
所以,这意味着如果我登录并显示30个帖子,那么它将执行30个查询以检查我投票的每个帖子以及我投票的内容。我的问题是,我可以通过加入(我猜)以及如何做到更短吗? (我已经尝试了一些东西,但没有成功)
答案 0 :(得分:0)
首先我要说的是,如果你要为登录的用户输出明显不同的输出,那么只需要有两个查询,而不是试图创建一些非常复杂的东西。
其次,这应该做你想要的事情:
SELECT p.*, u.username,
(SELECT SUM(vote) FROM votes WHERE postid = p.pid) total_votes,
(SELECT vote FROM votes WHERE postid = p.pid AND userv = $logged_in_user_id) my_vote
FROM posts p
JOIN users u ON p.userp = u.usernumber
WHERE p.belongs = $taken_from_url
ORDER BY p.pid DESC
注意:您没有说出投票表的值是什么。我假设它是+1(向上)或-1(向下),所以你可以通过将它们相加来轻松找到总票数。如果你不这样做,我建议你这样做,让你的生活更轻松。
可以通过JOIN
和GROUP BY
来消除第一个相关子查询,但我倾向于发现上述形式更具可读性。
所以这样做是因为它将用户加入帖子,就像你正在做的那样,除了它使用JOIN
语法(这再次归结为可读性)。然后它有两个子查询:第一个查找该特定帖子的总票数,第二个查找特定用户的投票结果: