2016-06-28 2 views
-1

привета Возникают студент данные я хочу, чтобы отобразить только первые вопросы соответствующих кандидатов от каждой секции ...отображающие вопросы

+0

Можете ли вы показать нам результат вашего запроса, по крайней мере, топ-10 – KaeL

+1

Я не буду отвечать на этот вопрос, потому что усилия, необходимые для управления 'status' столбец, используя строковые функции значительно превышает усилия, которые вы бы для нормализации вашей таблицы, а номера разделов и идентификаторов вопросов - как отдельные столбцы. –

+1

Ваши попытки 'SUBSTRING()' не будут работать, потому что ширина числа является переменной. Вам нужно будет использовать комбинацию 'INSTR' и' SUBSTRING', и это будет очень уродливо. –

ответ

1

Решение имитирует функцию SQL SERVER Row_Number(). Google mysql по порядку по пунктам в правильном направлении.

/*create temporary table t(can_id int, status varchar(20)); 

insert into t values    
(001 , 'section 1 question 1'),  
(001 , 'section 1 question 2'), 
(001 , 'section 1 question 3'), 
(001 , 'section 1 question 4'),  
(001 , 'section 2 question 1'),  
(001 , 'section 2 question 2'),  
(001 , 'section 2 question 3'),  
(001 , 'section 2 question 4'),  
(001 , 'section 3 question 1'),  
(001 , 'section 3 question 2'),  
(001 , 'section 3 question 3'),  
(002 , 'section 1 question 1'), 
(002 , 'section 1 question 2'), 
(002 , 'section 1 question 3'), 
(002 , 'section 2 question 1'), 
(002 , 'section 2 question 2'), 
(002 , 'section 2 question 3'), 
(002 , 'section 3 question 1'), 
(002 , 'section 3 question 2'), 
(002 , 'section 3 question 3'), 
(002 , 'section 3 question 4'); 

*/ 

select s.tcanid as 'can.id', substring(s.tstatus,11,11) as Question 
from 
(
select t.can_id as tcanid, t.status as tstatus , 
      @sno :=if(@previd = concat(t.can_id,substring(t.status,1,9)),@sno + 1,1) as canid 
      ,@previd:=concat(t.can_id,substring(t.status,1,9)) prevcanid 
from t, 
(select @sno:= 0) as sn 
,(select @Previd:= '') as p 
) s 
where s.canid <= 3 
+0

Ваш запрос не совсем такой же, как у меня - попробуйте вернуть aliass и исправьте оператор where, который он должен смотреть на псевдоним для sno –

0

По вашему требованию вы хотите первый 3 вопроса для каждого раздела, но вы не рассматривающий раздел в вашем запросе. Следующий запрос выполнит эту работу.

SELECT data_set.* 
FROM 
(

    SELECT temp.can_id 
      , temp.Section 
      , temp.Question 
      , ROW_NUMBER() OVER (PARTITION BY temp.can_id,temp.Section ORDER BY temp.can.id,temp.Section) as QUESTION_NO 
    FROM 
    (
     SELECT can.id as can_id 
       , SUBSTRING(status,11,11) as Question 
       , SUBSTRING(status,1,9) as Section 
     FROM samp_dat 
    ) temp 
) data_set 
WHERE 
    data_set.QUESTION_NO <=3 
+0

Mysql не имеет функции ROW_NUMBER() - правда. –

Смежные вопросы