因此,我正在编写一个临时表,该表根据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       |
-------------------------------------------------------------

先感谢您

#1楼 票数: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楼 票数:0

好的,我找到了解决方案,但是它基本上包括创建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`;

  ask by wUmpage translate from so

未解决问题?本站智能推荐:

1回复

MySQL,获取多行集合中一行的位置

我有这样的查询计算的位置publication了一组出版物(这里命名为内部community ),根据有effective_publishing_date : 这个结果为: [![在此处输入图像描述][1]][1] 现在我有一个feed_item列表,其中每个community_id和pu
3回复

MySQL在查询中使用count来搜索多行的可用性

我正在使用一张桌子,mrp用于存储多房间属性,另一张桌子用于存储预订房产的日期。 因此,我有以下表格: mrp(property_id,property_name,num_rooms) 预订(property_id,booking_id,日期) 无论何时预订酒店,都会
1回复

如何在mysql上编写查询,该查询将计算用户这次访问应用程序的连续多少天

我有这样的表: 并且需要接收如下内容: table <table><tbody><tr><th>Date</th><th>UserID</th><th>Days in Row&
1回复

MySQL查找行索引位置,复杂查询

我知道这里曾经多次被问过,这里的大部分帖子都是这样,但是我不能让它工作,所以想再问一遍。 问题: 有一个分数列表,我试图向用户显示他/她在分数列表中的位置。 有一个player_id,用户从两个表中选择(players.id,scores.player_id)。 我从来没有尝试过这
1回复

位置0错误没有行

我有以下代码: 但是,当我运行网页时,它给出了错误:位置0没有行。 但是当我使用代码时 strCountry获得正确的行数。 请帮忙 :(
3回复

MySQL 在列表中但不在临时表中的位置

我正在考虑以下 2 个表 我想在给定的 user_id 列表中获取 user_id 所在的所有 user_roles。 但我想排除所有具有 code_name = 'special_role' 角色的用户。 什么是最好的方法来做到这一点? 出于示例的目的,假设我有以下内容: 我的想法是使
2回复

PHP-在表格中的位置

如何找到数据库表中某一行的位置? 在我的数据库中,我有一堆来自游戏的玩家。 它们具有诸如ID,名称,级别,世界等列。 我想按“级别”对它们进行排序,然后查看它们在列表中的位置。 到目前为止,我已经尝试过了,但是它只打印出0(我输入的起始值)。 它似乎没有迭代。 以前,
1回复

在 MySQL 中连接两个表,结果集中只有一行,从第二个表中选择了几列

我面临着实现以下目标的挑战 有 2 个表,即 Transaction Table 和 Transaction_Event_LOG_INFO 表 交易表详情 SL TXN_ID TXN_FOR TXN_TYPE