【问题标题】:Change display of an element based upon criteria根据条件更改元素的显示
【发布时间】:2013-01-29 03:01:27
【问题描述】:

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

例如:

投给 未投赞成票 投票数: 77 ↑ ↓ 12 ↑ ↓

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

简介

包含消息

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

投票

包含投票

投票_id message_id_fk user_id 18 10 5 19 10 3

用户

包含用户名

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

有什么想法吗?

【问题讨论】:

标签: php mysql


【解决方案1】:

左加入投票表并检查是否找到任何相应的项目:

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) . "..."

【讨论】:

  • 嗯,我认为它几乎可以工作你只是忽略了名字
  • 是的,我忽略了这一点。我想你可以弄清楚如何选择更多的列?
  • 不知道错误说明了什么:不。好吧,也许......你的表被称为“用户”,所以显然“用户”不起作用。应该是:SELECT users.first_name, intro.message_id, ...
  • 不能24小时悬赏,对不起。
  • 表示您的查询无效。 MySQL 会告诉您更多信息:要调试查询,请在调用 mysql_fetch_array 之前放置 if (!$sql) die(mysql_error());
【解决方案2】:

如果您只想获得当前登录用户(比如 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 Fiddle

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

如果用户upvoted此帖子,它将显示投票的id。 如果用户没有投票,它将显示 NULL 值。

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

【讨论】:

  • 我不明白这应该如何工作.... 5 的投票,而不是其他投票的用户。
  • 因此,为了澄清,举个例子:您以“Suzy”身份登录(用户 ID 为 3),并且您想在列表中显示所有消息。 “Suzy”投票的帖子有 bold 的投票数,而其他的投票数普通?
  • 是的,如果您是 suzy,您想在列表中显示 Suzy 已投票的所有消息。
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 2021-03-09
  • 2021-01-24
  • 2017-05-20
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多