9

我希望用户能够区分他们是否已投票(通过加粗)或尚未投票(未加粗)。

例如:

       已投票 未投票
投票数:  77 ↑ ↓ 12 ↑ ↓

这是我的数据库的设置方式:

介绍

包含消息

    message_id 介绍 user_id up_vote
     10 投给后 5 77
     11 未投票 5 12

表决

包含投票

    Voting_id message_id_fk user_id
     18 10 5   
     19 10 3     

用户

包含用户名

    名字用户 ID
     鲍勃 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'];
}

有任何想法吗?

4

2 回答 2

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 JOINed 表中的列NULL
  • IF()是一个函数,如果第一个参数的值为真,则返回第二个参数,否则返回第三个参数。作为一个函数,它可以很容易地在SELECT子句中使用
  • 我替换SELECT *为显式选择所需的列,这被认为是最佳实践,在这种情况下是必要的,因为列名不明确
  • 当然,您必须将文字替换为5您当前的用户 ID。使用准备好的语句或像这样连接查询:"...Voting.user_id = " . intval($current_user_id) . "..."
于 2013-01-28T10:33:56.190 回答
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;

在您的代码中,使用正确的过程将上面的 3 替换为当前登录用户的 user_id。

SQL小提琴

如果您执行此查询,您会注意到我在结果中添加了一个列:voting_id。

如果用户这篇文章投了赞成票,它将显示投票的id。如果用户没有投票,它将显示NULL值。

然后,您可以在代码中检查此字段是否为,然后您就完成了!

于 2013-01-25T21:16:02.523 回答