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;
+-------+-----+--------+--------+--------+---------+-------+-----+
| 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.
假设您只需要 SN 在 cnt 列上的订单位置,您可以尝试下一个不依赖于的解决方案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
我有计算记录的代码,但无法在它之前添加顺序。
连接了两个表,我添加了统计记录的代码。问题是我想先 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;
+-------+-----+--------+--------+--------+---------+-------+-----+
| 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.
假设您只需要 SN 在 cnt 列上的订单位置,您可以尝试下一个不依赖于的解决方案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