【问题标题】:mysql - count records after ORDER BYmysql - 计算 ORDER BY 之后的记录
【发布时间】:2019-03-01 05:05:49
【问题描述】:

我有计算记录的代码,但无法在它之前添加 order by。

连接了两个表,我添加了代码来计算记录。问题是我想先 ORDER BY SN 然后再分配 cnt?

我的代码是:

表格

 create table rot (
            code int(10) primary key,
            PN varchar(10) not null,
        SN varchar(10) not null,
            LocID int(10) not null);

    insert into rot values (1,'T1','T1SN1','1');
    insert into rot values (2,'A1','A1SN1','2');
    insert into rot values (3,'J1','J1SN1','3');
    insert into rot values (4,'A2','A2SN1','1');
    insert into rot values (5,'J2','J2SN1','2');
    insert into rot values (6,'A3','A3SN1','3');
    insert into rot values (7,'J3','J3SN1','4');
    insert into rot values (8,'T1','T1SN2','5');
    insert into rot values (9,'A1','A1SN2','1');
    insert into rot values (10,'J2','J2SN2','3');
    insert into rot values (11,'J2','J2SN3','4');
    insert into rot values (12,'A1','A1SN3','3');
    insert into rot values (13,'J2','J2SN4','5');

    create table loc(
        code1 int(10) primary key,
        LocVar varchar(10) not null);

    insert into loc values (1,'AAA');
    insert into loc values (2,'BBB');
    insert into loc values (3,'CCC');
    insert into loc values (4,'DDD');
    insert into loc values (5,'EEE');

Cnt代码:

SELECT * FROM rot
JOIN loc ON rot.code = loc.code1

JOIN (
            SELECT t1.code, count(*) cnt FROM (
                SELECT distinct code
                FROM rot ts1 
            JOIN loc tx1 ON ts1.code = tx1.code1 

) t1 
JOIN (
    SELECT distinct code
                FROM rot ts2
            JOIN loc tx2 ON ts2.code = tx2.code1

    ) t2 on t1.code <= t2.code 
    group by t1.code 

) tt ON rot.code = tt.code

结果:

+------+----+-------+-------+-------+--------+------+-----+
| code | PN | SN    | LocID | code1 | LocVar | code | cnt |
+------+----+-------+-------+-------+--------+------+-----+
|    2 | A1 | A1SN1 |     2 |     2 | BBB    |    2 |   4 |
|    4 | A2 | A2SN1 |     1 |     4 | DDD    |    4 |   2 |
|    3 | J1 | J1SN1 |     3 |     3 | CCC    |    3 |   3 |
|    5 | J2 | J2SN1 |     2 |     5 | EEE    |    5 |   1 |
|    1 | T1 | T1SN1 |     1 |     1 | AAA    |    1 |   5 |
+------+----+-------+-------+-------+--------+------+-----+

期望的结果

+------+----+-------+-------+-------+--------+------+-----+
| code | PN | SN    | LocID | code1 | LocVar | code | cnt |
+------+----+-------+-------+-------+--------+------+-----+
|    2 | A1 | A1SN1 |     2 |     2 | BBB    |    2 |   1 |
|    4 | A2 | A2SN1 |     1 |     4 | DDD    |    4 |   2 |
|    3 | J1 | J1SN1 |     3 |     3 | CCC    |    3 |   3 |
|    5 | J2 | J2SN1 |     2 |     5 | EEE    |    5 |   4 |
|    1 | T1 | T1SN1 |     1 |     1 | AAA    |    1 |   5 |
+------+----+-------+-------+-------+--------+------+-----+

我只是想知道在哪里放置 ORDER BY?在我的代码中,我无法分配变量,代码必须以 SELECT 开头。

【问题讨论】:

  • 你想要一个序列号,对吧?不算数。除了 cnt 列之外,Results 和 Desired results 之间没有差异。但是行顺序根本没有改变。令人困惑
  • 这个计数在这里代表什么?我的意思是你想从你的数据中得到哪些计数?你能把你的问题说得更清楚吗
  • 我建议更好地解释您的需求。在 Results 表和您所做的查询的逻辑中,cnt 列保留了一个计数器,用于记录大于或等于代码值的代码数行。换句话说,例如,代码 2 小于或等于 2、3、4 和 5,因此您将 4 存储在 cnt 列上。在 Desired results 中,这已经失去了意义,因为您只将排序的位置保存在 cnt 列中。
  • 我同意 D. Smania 的观点。你的计数就是它,它不应该因为排序而改变。否则计数不再匹配对应的 SN。

标签: mysql join select sql-order-by


【解决方案1】:

如果 MySQL 8.0 你可以使用ROW_NUMBER:

SELECT *, rot.code, ROW_NUMBER() OVER(ORDER BY SN) AS cnt
FROM rot
JOIN loc ON rot.code = loc.code1
ORDER BY SN;

db<>fiddle demo

+-------+-----+--------+--------+--------+---------+-------+-----+
| code  | PN  |  SN    | LocID  | code1  | LocVar  | code  | cnt |
+-------+-----+--------+--------+--------+---------+-------+-----+
|    2  | A1  | A1SN1  |     2  |     2  | BBB     |    2  |   1 |
|    4  | A2  | A2SN1  |     1  |     4  | DDD     |    4  |   2 |
|    3  | J1  | J1SN1  |     3  |     3  | CCC     |    3  |   3 |
|    5  | J2  | J2SN1  |     2  |     5  | EEE     |    5  |   4 |
|    1  | T1  | T1SN1  |     1  |     1  | AAA     |    1  |   5 |
+-------+-----+--------+--------+--------+---------+-------+-----+

【讨论】:

    【解决方案2】:

    试试这个:

    SELECT * FROM (
        SELECT *
        FROM rot
        JOIN loc ON rot.code = loc.code1
        JOIN (
            SELECT t1.code3, count(*) cnt
            FROM (
                SELECT distinct code as code3
                FROM rot ts1
                JOIN loc tx1 ON ts1.code = tx1.code1
            ) t1
            JOIN (
                SELECT distinct code
                FROM rot ts2
                JOIN loc tx2 ON ts2.code = tx2.code1
            ) t2 on t1.code3 <= t2.code group by t1.code3
        ) tt ON rot.code = tt.code3
    )X
    ORDER BY X.cnt ASC;
    

    【讨论】:

    • 您是否进行了测试以得出它没有返回预期结果的结论?
    • 是的,我已经测试过了
    • @Avinash - 未按 SN 订购。
    • @Kalenji 你想按SN订购吗?
    • 是的,根据我的原始查询。
    【解决方案3】:

    根据上面给出的详细信息,您可以使用以下查询获得所需的结果:

    SELECT code, PN,SN,LocID,code1,LocVar ,code, @row := @row + 1 AS cnt FROM (
    SELECT  code, PN,SN,LocID,code1,LocVar
    FROM rot 
    JOIN loc 
    ON code=code1
    ORDER BY SN) tab, (SELECT @row := 0) r;
    

    期望的结果:

    +------+----+-------+-------+-------+--------+------+------+
    | CODE | PN | SN    | LocID | code1 | LocVar | CODE | cnt  |
    +------+----+-------+-------+-------+--------+------+------+
    |    2 | A1 | A1SN1 |     2 |     2 | BBB    |    2 |    1 |
    |    4 | A2 | A2SN1 |     1 |     4 | DDD    |    4 |    2 |
    |    3 | J1 | J1SN1 |     3 |     3 | CCC    |    3 |    3 |
    |    5 | J2 | J2SN1 |     2 |     5 | EEE    |    5 |    4 |
    |    1 | T1 | T1SN1 |     1 |     1 | AAA    |    1 |    5 |
    +------+----+-------+-------+-------+--------+------+------+
    

    希望您希望通过您的查询来实现这一目标。请检查并享受:)!

    【讨论】:

    • 根据原始查询 - 我不能使用变量。
    【解决方案4】:

    据我了解,并根据我对您的问题所做的评论,我将在下面引用:

    Results 表和您所做的查询的逻辑中, cnt 列保留与行的代码值相比大于或等于代码数量的计数器。换句话说,和 例如,代码 2 小于或等于代码 2、3、4 和 5,因此您 在 cnt 列上存储一个 4。但是,在 Desired Results 这 失去了所有意义,因为您只保存当前的位置 在 cnt 列上排序。

    假设您只需要 cnt 列上的 SN 的订单位置,您可以尝试下一个不依赖 MySQL 8.0 且不使用 user- 的解决方案变量:

    SELECT rot.*,
           loc.*,
           ( SELECT COUNT(*)
             FROM rot AS rot1
             INNER JOIN loc AS loc1 ON loc1.code1 = rot1.code
             WHERE rot1.SN <= rot.SN ) AS cnt
    FROM
        rot
    INNER JOIN
        loc ON loc.code1 = rot.code
    ORDER BY
        rot.SN
    

    【讨论】:

      【解决方案5】:
      SELECT code, PN, SN, LocID, code1, LocVar, code, @rownum:=@rownum + 1 as cnt FROM rot
      JOIN loc ON rot.code = loc.code1
      JOIN (
          SELECT distinct code
                      FROM rot ts2
                  JOIN loc tx2 ON ts2.code = tx2.code1
      
          ) t2 on t1.code <= t2.code 
          group by loc.code1 
          order by rot.SN; 
      

      这就是你想要的吗?

      【讨论】:

      • 根据原始查询 - 我不能使用变量。
      • 为什么不能使用变量...?
      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多