我希望用户能够区分他们是否投了某些东西(通过加粗)或者还没有投票(没有加粗)。
例如:
Voted For Post Unvoted for Votes: 77 ↑ ↓ 12 ↑ ↓
以下是我的数据库设置方式:
包含消息
message_id intro user_id up_vote 10 Voted For Post 5 77 11 Unvoted for 5 12
包含投票
Voting_id message_id_fk user_id 18 10 5 19 10 3
包含用户名
first_name user_id BOB 5
我不知道如何正确查询数据库,然后制作适当的if statement
,以区分投票和投票的帖子。
这是我到目前为止所拥有的:
$sql = mysql_query("SELECT * FROM intro
INNER JOIN users ON intro.user_id = users.user_id
ORDER BY `up` DESC ");
echo $row['first_name'] . " " . $row['intro'];
if( ??? ) {
echo "<strong>" . $row['up_vote'] . "</strong>";
} else {
echo $row['up_vote'];
}
有什么想法吗?
答案 0 :(得分:4)
左边加入投票表并检查是否找到了相应的项目:
SELECT intro.message_id, intro.intro, intro.user_id, intro.up_vote,
IF(Voting.user_id IS NULL, 0, 1) AS has_voted
FROM intro
INNER JOIN users ON intro.user_id = users.user_id
LEFT JOIN Voting ON Voting.message_id_fk=intro.message_id
AND Voting.user_id = 5
ORDER BY `up` DESC
然后在PHP中:
if($row['has_voted'){
echo "<strong>".$row['up_vote']."</strong>";
}else {
echo $row['up_vote'];
}
一些解释:
LEFT JOIN
ed表中的列为NULL
IF()
是一个函数,如果第一个参数的计算结果为true,则返回第二个参数,否则返回第三个参数。作为一个函数,它可以很容易地用在SELECT
子句SELECT *
,这被认为是最佳做法,在这种情况下由于列名不明确而必要5
。使用预准备语句或连接查询,如下所示:"...Voting.user_id = " . intval($current_user_id) . "..."
答案 1 :(得分:1)
如果您希望只有当前登录用户的帖子(比如用户具有user_id = 3)已经对它们进行了投票,则可以使用此查询:
SELECT u.first_name,
m.message_id,
m.message,
m.up_vote,
v.Voting_id
FROM Users u,
Messages m
LEFT JOIN Voting v ON v.message_id_fk = m.message_id AND v.user_id = 3
WHERE u.user_id = m.user_id;
在您的代码中,使用正确的过程将当前登录用户的user_id替换为上面的3。
如果执行此查询,您会注意到我在结果中添加了一列:voting_id。
如果用户赞成此帖子,则会显示投票的 ID 。 如果用户没有 upvote,则会显示 NULL 值。
然后,您可以在代码中检查 not null 中的此字段,然后就完成了!