首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mysql组将对投票系统进行概述

Mysql组将对投票系统进行概述
EN

Stack Overflow用户
提问于 2014-11-03 23:19:50
回答 2查看 122关注 0票数 4

我希望user_id 2能够概述另一个用户在他的帐户上所做的最后操作,

  1. 投赞成票
  2. 投反对票
  3. 确认
  4. 未证实

每次用户执行某个操作时,都会在右列添加一行1。空元素中填充0。

用户是投票者,user_id是投票人。

代码语言:javascript
运行
复制
| id | user | user_id | up | down | confirm | unconfirm |    date    |
+----+------+---------+----+------+---------+-----------+------------+
| 1  |  1   |    2    | 1  |      |         |           | 2014-11-03 |
| 2  |  1   |    2    | 1  |      |         |           | 2014-11-03 |
| 3  |  1   |    2    |    |  1   |         |           | 2014-11-03 |
| 4  |  1   |    2    |    |  1   |         |           | 2014-11-03 |
| 5  |  1   |    2    |    |  1   |         |           | 2014-11-03 |
| 6  |  1   |    2    | 1  |      |         |           | 2014-11-03 |
| 7  |  1   |    2    |    |      |    1    |           | 2014-11-03 |
| 8  |  1   |    2    |    |      |         |     1     | 2014-11-03 |
| 9  |  1   |    2    |    |      |    1    |           | 2014-11-03 | //THIS
| 10 |  1   |    2    | 1  |      |         |           | 2014-11-03 | // THIS
| 11 |  3   |    2    |    |  1   |         |           | 2014-11-03 |
| 12 |  3   |    2    | 1  |      |         |           | 2014-11-03 | //THIS
| 13 |  3   |    2    |    |      |    1    |           | 2014-11-03 | // THIS
+----+------+---------+----+------+---------+-----------+------------+

输出:最后一次向上或向下,最后一次确认或未确认来自每个用户

  • 用户3确认,
  • 用户3向上,
  • 用户1向上,
  • 用户1确认。
代码语言:javascript
运行
复制
SELECT * FROM table WHERE user_id = 2 GROUP BY .. ORDER BY id DESC

if($data['up'] == '1')
{
 echo "You have been voted up ... You've earned.."; 
}

else if($data['down'] == '1')
{
 echo "You have been voted down ... now you need to.."; 
}

...
EN

回答 2

Stack Overflow用户

发布于 2014-11-04 02:59:32

要获得用户的最新操作,只需使用该user_id拉出所有行,按日期按降序排序,并将其限制为1。

代码语言:javascript
运行
复制
SELECT *
FROM myTable
WHERE user_id = 2
ORDER BY date DESC
LIMIT 1;

在另一个注意事项上,

如果我可以在这里评论一下您的表设计,我真的认为您可以将各种操作放入自己的表中,并在您的表中有一个action_id列。换句话说,它看起来是这样的:

action_values

代码语言:javascript
运行
复制
| id |   action  |
+----+-----------+
| 1  | up        |
| 2  | down      |
| 3  | confirm   |
| 4  | unconfirm |

actions

代码语言:javascript
运行
复制
| id | user | user_id | actionID |    date    |
+----+------+---------+----------+------------+
| 1  |  1   |    2    |     1    | 2014-11-03 |
| 2  |  1   |    2    |     1    | 2014-11-03 |
| 3  |  1   |    2    |     2    | 2014-11-03 |
| 4  |  1   |    2    |     2    | 2014-11-03 |
| 5  |  1   |    2    |     2    | 2014-11-03 |
| 6  |  1   |    2    |     1    | 2014-11-03 |
| 7  |  1   |    2    |     3    | 2014-11-03 |
| 8  |  1   |    2    |     4    | 2014-11-03 |
| 9  |  1   |    2    |     3    | 2014-11-03 |
| 10 |  1   |    2    |     1    | 2014-11-03 |
| 11 |  3   |    2    |     2    | 2014-11-03 |
| 12 |  3   |    2    |     1    | 2014-11-03 |
| 13 |  3   |    2    |     3    | 2014-11-03 |

这将使您的查询略有不同,但它肯定会使事情正常化得更好,并有助于避免插入和更新异常。如果您对此感兴趣,请参阅这个SQL Fiddle获取查询将如何更改的示例。

编辑

关于获得最新的行动,见我的答案这里。它可能会有帮助,因为它讨论了从一个组获得N个案例,这就是你在这里试图做的事情。你想从每一组得到最新的病例。

因此,我尝试在SQL中这样做,并进行了一些尝试和错误,但我能够让它正常工作。不幸的是,我无法一举解决所有这些问题,但我想出了一个查询,它可以从每个用户那里得到最新的信息:

代码语言:javascript
运行
复制
SELECT *
FROM myTable m
WHERE(
  SELECT COUNT(*)
  FROM myTable mt
  WHERE mt.user_id = 2
    AND m.user_id = 2
    AND mt.user = m.user
    AND mt.date >= m.date
    AND (mt.up = 1 OR mt.down = 1)
) <= 1
AND (m.up = 1 OR m.down = 1);

简而言之,嵌套部分所做的是获取对用户2进行投票的行,由投票的用户分组,筛选最大日期,并将结果限制在0或1行。我在这里添加了向上和向下的条件,这样它只会拉出行,其中的动作是向上或向下的投票。很容易,您可以为确认/未确认编写相反的查询,并将这两个查询合并在一起,如下所示:

代码语言:javascript
运行
复制
(SELECT *
FROM myTable m
WHERE(
  SELECT COUNT(*)
  FROM myTable mt
  WHERE mt.user_id = 2
    AND m.user_id = 2
    AND mt.user = m.user
    AND mt.date >= m.date
    AND (mt.up = 1 OR mt.down = 1)
) <= 1
AND (m.up = 1 OR m.down = 1))
UNION
(SELECT *
FROM myTable m
WHERE(
  SELECT COUNT(*)
  FROM myTable mt
  WHERE mt.user_id = 2
    AND m.user_id = 2
    AND mt.user = m.user
    AND mt.date >= m.date
    AND (mt.confirm = 1 OR mt.confirm = 1)
) <= 1
AND (m.confirm = 1 OR m.confirm = 1));

我正在讨论如何缩短这个查询,但是在这个给定的时刻,它是我所拥有的最好的,而且它是工作中,所以希望这将使您再次前进。

票数 4
EN

Stack Overflow用户

发布于 2014-11-04 00:13:39

假设您的id是一个自动增量列,您可以获得每个user_id的最新id,如下所示。

代码语言:javascript
运行
复制
SELECT MAX(id) AS id
  FROM table
GROUP BY user_id

然后,您可以将该子查询连接到原始表,以提取最新条目的数据。

代码语言:javascript
运行
复制
SELECT a.id, a.user, a.user_id, a.up, a.down, a.confirm, a.unconfirm, a.date
  FROM table AS a
  JOIN (
        SELECT MAX(id) AS id
          FROM table
         GROUP BY user_id
       ) AS b ON a.id = b.id
 WHERE a.user_id = 2

然后,您可以将该查询与您的php代码、$data['up']等一起使用,这将为您提供一种显示最新事务的好方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26725073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档