繁体   English   中英

在临时表MySQL中获取行位置

Getting row position in a temporary table MySQL

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

因此,我正在编写一个临时表,该表根据DESC顺序中的total_points设置position ,即IE用户拥有的积分越多,他们的排名就越高。

我还将从该表中选择一个subscriber_id ,以获取给定用户的当前position

但是,我遇到了很多奇怪的问题,这是我的代码:

SET @rownum := 0;

SELECT t.`subscriber_id`,
t.`total_points`,
s.`account_type`,
@rownum := @rownum + 1 AS `position`
FROM `subscribers_points` t
LEFT JOIN (
    SELECT `id`, `account_type` 
    FROM `subscribers`
) s
    on s.`id` = t.`subscriber_id`
WHERE t.`year` = 2015
AND t.`month` = 1
ORDER BY t.`total_points` DESC

我想过滤掉1,2和9的所有account_types ,但是无论何时我将其添加到subscribers_points WHERE子句中,我的表都不再基于total_points给出position ,而是按subscriber_id给出position ,这对我来说很奇怪,对我来说没有意义。

为了澄清起见,表subscribers包含account_type字段。 subscriber_points表包含total_points字段。

这是理想表的外观:

-------------------------------------------------------------
|  subscriber_id |  position |  total_points | account_type  |
-------------------------------------------------------------
|    52          |     1     |       10      |       7       |
|   125          |     2     |       8       |       4       |
|    87          |     3     |       9       |       3       |
|    12          |     4     |       5       |       6       |
|    45          |     5     |       2       |       4       |
-------------------------------------------------------------

先感谢您

2 个回复

MySQL对计算行间值很不了解:

具有6个连续值的基本简单表:

mysql> create table foo (x int);
mysql> insert into foo (x) values (0), (1), (2), (3), (4), (5);

mysql> set @pos := 0;
mysql> select @pos := @pos + 1, x from foo where x not in (2, 3);
+------------------+------+
| @pos := @pos + 1 | x    |
+------------------+------+
|                1 |    0 |
|                2 |    1 |
|                3 |    4 |
|                4 |    5 |
+------------------+------+

一切看起来都很好。 我们消除了两行,位置编号是连续的,并且看起来MySQL正确地不会评估@pos更新,除非结果集中包含一行。 但是随后您向系统中添加了一些排序:

mysql> set @pos := 0;
mysql> select @pos := @pos + 1, x from foo where x not in (2, 3) order by x desc;
+------------------+------+
| @pos := @pos + 1 | x    |
+------------------+------+
|                1 |    5 |
|                2 |    4 |
|                3 |    1 |
|                4 |    0 |
+------------------+------+

请注意,即使我们已经颠倒了行的顺序,该位置仍如何增加。 您可能会认为@pos + 1会在扫描表和包含/排除行时得到评估。 但是不。 在包含行并对其进行排序之后 ,它以某种方式完成。

这意味着您计算出的排名基本上与您在其余查询中获取的值无关。 但是,如果按职位排序,则更加令人困惑:

mysql> set @pos := 0;
mysql> select @pos := @pos + 1 as pos, x from foo where x not in (2, 3) order by pos desc;
+------+------+
| pos  | x    |
+------+------+
|    4 |    5 |
|    3 |    4 |
|    2 |    1 |
|    1 |    0 |
+------+------+

x值与位置一起排序。 因此,将那些位置值与匹配的记录粘合在一起的任何方法都是...奇怪的。

好的,我找到了解决方案,但是它基本上包括创建2个临时表,以便在同一位置获得我想要的确切值,然后运行SELECT以为用户赋予适当的排名。

下面的代码:

    CREATE TEMPORARY TABLE IF NOT EXISTS `temp_rank_table` AS(
        SELECT p.`subscriber_id`, p.`total_points`, s.`account_type`
        FROM `subscribers_points` p 
            LEFT JOIN `subscribers` s
            ON s.`id` = p.`subscriber_id`
        WHERE p.`year` = _year
        AND p.`month` = _month
        AND s.`account_type` BETWEEN 3 AND 8
        AND `password_created` = 1
        AND `verified` = 1
        AND `active` = 1
        ORDER BY p.`total_points` DESC
    );

    SET @rank=0;

    CREATE TEMPORARY TABLE IF NOT EXISTS `temp_rank_table_count` AS(
        SELECT @rank:=@rank+1 AS `rank`, `subscriber_id`, `total_points`
        FROM `temp_rank_table`
        ORDER BY `total_points` DESC
    );

    #

    SELECT t.`rank`, t.`subscriber_id`, t.`total_points`
    FROM `temp_rank_table_count` t
    WHERE `subscriber_id` = _subscriber_id;

    DROP TABLE `temp_rank_table`;
    DROP TABLE `temp_rank_table_count`;
1 mysql 不更新临时表中的行

我有一个具有这种结构的表Provision : 和其他一些废话 我加载了一个名为tempTable的临时表,它具有相同的结构和相同的数据。 在尝试之前,我正在尝试Provision表中的neID是一个varchar字段。 与集合不同的值被删除。 (我以前这样做过没有问题。) 既不是这个: ...

2016-03-10 18:08:34 1 38   mysql
2 MySQL将多列和行插入临时表

我有一张临时表: 然后我尝试在此表中添加新值 而这一行引发了错误。 错误给出: 1064 - 您的SQL语法出错; 检查与MySQL服务器版本对应的手册,以获得正确的语法 'SELECT COUNT(*)as count,year(end_date)FROM ...

2013-08-21 03:35:24 1 3885   mysql
3 从临时表中获取行并用于IN语句

我的上一个帖子有问题。 好了,我有一个临时表,其中包含多行数字: 它被保存到一个表变量中: 我需要将所有这些值都放入另一个查询中的in语句中: 如何将所有行添加到可以在IN语句中使用的变量中? ...

4 在mysql中重用临时表

我有这样的查询: 我如何重用而不是重新查询该临时表的SELECT id,content,userid FROM article WHERE type='A' LIMIT 10 ? ...

2014-10-10 08:15:59 2 662   mysql/ sql
5 在MySql中多次访问临时表

我试图使用一个临时表作为SELECT语句的中间结果持有人。 问题是尽管我无法在其他查询语句中多次访问临时表,但我希望这是可能的,即使临时表无用。 MySql中是否有替代临时表的方法,允许我提取SQL语句。 我无法使用存储过程(无法从公司使用的Web框架版本访问它们),而且我也不想使 ...

6 如何从MySQL中的视图创建临时表?

我有一条SQL语句,如下所示: 但是, UserRoles表最近已更改为视图,现在出现以下错误: 有没有办法我仍然可以使用视图结构创建此临时表,还是需要自己在SQL中写出该表? ...

7 MySQL临时表存储在RAM中?

我已经开发了一个小型的c#应用程序,该应用程序使用了大量的数据库计算。 我在共享托管环境中托管我的应用程序。 我正进入(状态 : mysql out of memory exception 我使用了大量的临时表。 这些表存储在哪里? 这可能是导致此错误的原因吗? 谢谢 ...

8 替代Oracle中的MySQL临时表

我注意到这两个系统中临时表的概念是不同的,我有一个冥想......我在MySQL中有以下场景: 删除临时表'a'(如果存在) 创建临时表'a' 通过存储过程使用数据填充它 使用另一个存储过程中的数据 如何在Oracle中实现相同的方案? 我可以(在一个 ...

9 在MySQL中授予对临时表的选择

我有一个MySQL数据库,该用户只能访问几个表。 已为该用户授予此数据库的CREATE TEMPORARY TABLES ,并且通过查看查询日志,我可以看到他们创建了一个临时表,然后在尝试从中选择时失败。 在GRANT SELECT ON TABLE 'db'.'tmp_tbl' TO 'u ...

10 临时表可以在MySQL中重用吗?

所以老板给了我一个存储过程,因为它很慢,所以需要对其进行优化。 该过程正在过程中创建一个临时表,看起来很奇怪: 就是这样。 该代码将数据插入到临时表中,仅在此之后才被检索。 这是我所做的,我删除了临时表并直接返回所选记录: 之前的代码看起来不对,但是我想确定临时表的作用。 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM