Ищем помощь. Я пытаюсь запустить код в этом порядке JOIN, WHERE и номер GRP (по результатам моего запроса).
У меня есть две таблицы test и text:
create table test (
code varchar(10) primary key,
num int(10) not null,
name varchar(10) not null,
surname varchar(10) not null);
insert into test values (1,09,'Tom', 'Smith');
insert into test values (2,09,'Adam','Blake');
insert into test values (3,15,'John','Smith');
insert into test values (4,15,'Adam','XYZ');
insert into test values (5,43,'John','Abc');
insert into test values (6,99,'Adam','Abc');
insert into test values (7,99,'John','Abc');
insert into test values (8,15,'Adam','XYZ');
insert into test values (9,43,'John','Abc');
insert into test values (10,99,'Adam','Abc');
insert into test values (11,99,'John','Abc');
insert into test values (12,1,'A','A');
insert into test values (13,1,'J','A');
и текст таблицы:
create table text (
code varchar(10) primary key,
codeFK varchar(10) not null,
state varchar(10));
insert into text values (1,2,'O');
insert into text values (2,2,'O');
insert into text values (3,2,'O');
insert into text values (4,2,'C');
insert into text values (5,3,'O');
insert into text values (6,3,'O');
insert into text values (7,3,'O');
insert into text values (8,2,'O');
insert into text values (9,2,'C');
insert into text values (10,2,'O');
insert into text values (11,2,'C');
insert into text values (12,1,'C');
insert into text values (13,12,'C');
insert into text values (14,13,'C');
Я присоединяюсь к ним и пытаюсь добавить группу coulm в соответствии с приведенным ниже кодом:
JOIN - он работает
SELECT num FROM test
LEFT JOIN text ON test.code = text.codeFK
WHERE state = 'O'
ORDER BY test.num DESC;
Расчет ВРП на
select t.*,
(select count(distinct t2.num)
from test t2
where t2.num <= t.num
) as grp
from test t ORDER BY GRP;
Но мой вопрос заключается в том, как получить столбец GRP с вышеуказанным запросом соединения? Таким образом, столбец grp будет вычисляться только по результатам, основанным на инструкции WHERE, а не по всему тесту таблицы.
Я попробовал ниже, но это дает мне ошибку:
SELECT num FROM test
LEFT JOIN text ON test.code = text.codeFK
WHERE state = 'O'
AND test.num IN (select t.num,
(select count(distinct t2.num)
from test t2
where t2.num <= t.num
) as grp from test t)
ORDER BY test.num DESC;
Желаемые результаты:
Попробуй это:
select test.num, tt.cnt from test
join text on test.code = text.codefk
join (
select t1.num, count(*) cnt from (
select distinct num
from test ts1
join text tx1 on ts1.code = tx1.codefk
where tx1.state = 'O'
) t1 join (
select distinct num
from test ts2
join text tx2 on ts2.code = tx2.codefk
where tx2.state = 'O'
) t2 on t1.num <= t2.num
group by t1.num
) tt on test.num = tt.num
where text.state = 'O'
Другой способ, более эффективный:
select @lagNum := 0, @cnt := 0;
select num, cnt from (
select case when num <> @lagNum then @cnt := @cnt + 1 end, @cnt cnt, @lagNum := num, num
from (
select (select num from test where code = t.codefk) num
from text t
where state = 'O'
) a order by num
) a
EDITED: Это должно указывать на правильное направление. Вместо этого второго запроса в AND
это должно быть то, что вы выбираете
моя скрипка: http://sqlfiddle.com/#!9/2fe48b/36
select t.num,
(select count(distinct t2.num) - 1
from test t2
where t2.num <= t.num
) as grp
from test t
LEFT JOIN text ON t.code = text.codeFK
WHERE text.state = 'O'
ORDER BY t.num DESC;
select t.num, t.name, (select count(distinct t2.num) from test t2 where t2.num <= t.num ) as grp from test t LEFT JOIN text ON t.code = text.codeFK GROUP BY t.num, t.name,grp,text.state HAVING text.state = 'O'