mysql - 统计 ORDER BY 之后的记录

mysql - count records after 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.

开头

试试这个:

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;
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; 

这是你想要的吗?

如果 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 |
+-------+-----+--------+--------+--------+---------+-------+-----+

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

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 |
+------+----+-------+-------+-------+--------+------+------+

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

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

In the Results table and the logic of the query you have made, the cnt column keep a counter of the number of codes that are greater or equal compared to the code value of the row. In other words, and for example, code 2 is lower or equal than codes 2,3,4 and 5, so you store a 4 on the cnt column. But, in the Desired Results this has lost all sense, since you only save the position of the current ordering on the cnt column.

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

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