mysql - количество записей после ORDER BY - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть код для подсчета записей, но я не могу добавить порядок перед ним.

Две таблицы объединены, и я добавил код для подсчета записей.Проблема в том, что я хочу сначала 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.

Ответы [ 5 ]

0 голосов
/ 04 октября 2018

Из того, что я понимаю, и на основании комментария, который я сделал к вашему вопросу, я процитирую следующее:

В таблице Results и логикезапрос, который вы сделали, столбец cnt содержит счетчик количества кодов, которые больше или равны по сравнению со значением кода строки.Другими словами, например, код 2 меньше или равен кодам 2,3,4 и 5, поэтому вы сохраняете 4 в столбце cnt .Но в Желаемые результаты это утратило всякий смысл, поскольку вы сохраняете только позицию текущего порядка в столбце cnt .

Предполагая, что вынужна только позиция заказа по 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
0 голосов
/ 29 сентября 2018

Согласно приведенным выше сведениям, вы можете получить желаемый результат, используя следующий запрос:

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

Надеюсь, что вы хотитедобиться этого с помощью вашего запроса.Пожалуйста, проверьте и наслаждайтесь :)!

0 голосов
/ 28 сентября 2018
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; 

Это то, что вы хотите?

0 голосов
/ 29 сентября 2018

Если 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 |
+-------+-----+--------+--------+--------+---------+-------+-----+
0 голосов
/ 25 сентября 2018

Попробуйте это:

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