根据标准更改元素的显示

时间:2013-01-25 20:56:37

标签: php mysql

我希望用户能够区分他们是否投了某些东西(通过加粗)或者还没有投票(没有加粗)。

例如:

       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'];
}

有什么想法吗?

2 个答案:

答案 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 *,这被认为是最佳做法,在这种情况下由于列名不明确而必要
  • 当然,您必须使用当前用户ID替换文字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。

SQL Fiddle

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

如果用户赞成此帖子,则会显示投票的 ID 。 如果用户没有 upvote,则会显示 NULL 值。

然后,您可以在代码中检查 not null 中的此字段,然后就完成了!