2016-12-13 2 views
1

У меня есть следующая структура таблицы в MySQL, для которой я должен написать кодMySQL запрос, чтобы получить следующую запись, если существует еще 0

id Docid deptid 
------------------- 
1 Doc1 dept1 
2 Doc2 dept1 
3 Doc3 dept2 
4 Doc4 dept2 
5 Doc5 dept2 

Я должен написать запрос, чтобы получить Docid в последовательном порядке для над структурой MySQL таким образом, что при приближении клиента dept1, который имеет 2 Docid s - Doc1 и Doc2. Когда клиент подходит к dept1, он должен сначала направить его на Doc1, а затем на Doc2, и если он снова захочет приблизиться к dept1 для получения дополнительных документов, тогда код снова перенаправит его на Doc1 и наоборот.

То же самое должно произойти по dept2, который имеет 3 Docid S - Doc3, Doc4 и Doc5. Если клиент впервые подходит к dept2, тогда MySQL должен сначала направить его на Doc3, затем на Doc4 и последним на Doc5. Если клиент обратился ко всем Документам в dept2, он должен быть снова перенаправлен на Doc3, и весь цикл повторяется всякий раз, когда клиент приближается к dept2.

Я не получаю, как написать запрос или реструктурировать столбцы таблицы, чтобы я мог получить следующий Docid каждый раз, когда я выполняю выбор запроса, деля фильтр.

Просьба провести реструктуризацию и написать запрос MySQL для этого случая.

Благодарим вас за все ваши ценные предложения.

+0

Akansha, что вы еще пробовали? –

+0

Почему вы не используете 'order by Docid asc' с вашим SQL-запросом –

+0

Я управляю другой таблицей, чтобы сохранить идентификаторы пользователя в департаменте, для которого пользователь посещает , и, используя это, я пытаюсь получить следующий доктор Идентификаторы http://stackoverflow.com/questions/1446821/how-to-get-next-previous-record-in-mysql – Akanksha

ответ

1

Вы можете сгенерировать deptdocid столбец, используя номер строки моделирования , например, с учетом этого

drop table if exists t; 
create table t (id int, Docid varchar(10), deptid varchar(10)); 
insert into t values 
(1 , 'Doc1', 'dept1'), 
(2 , 'Doc2', 'dept1'), 
(3 , 'Doc3', 'dept2'), 
(4 , 'Doc4', 'dept2'), 
(5 , 'Doc5', 'dept2'); 

ariaDB [sandbox]> select t.*, 
    -> if(t.deptid <> @p , @rn:=1,@rn:[email protected]+1) deptdocid, 
    -> @p:=t.deptid 
    -> from (select @rn:=0,@p:='') rn, t 
    -> order by t.deptid, t.id; 
+------+-------+--------+-----------+--------------+ 
| id | Docid | deptid | deptdocid | @p:=t.deptid | 
+------+-------+--------+-----------+--------------+ 
| 1 | Doc1 | dept1 |   1 | dept1  | 
| 2 | Doc2 | dept1 |   2 | dept1  | 
| 3 | Doc3 | dept2 |   1 | dept2  | 
| 4 | Doc4 | dept2 |   2 | dept2  | 
| 5 | Doc5 | dept2 |   3 | dept2  | 
+------+-------+--------+-----------+--------------+ 
5 rows in set (0.00 sec) 

и если мы имеем

MariaDB [sandbox]> select * from drdept; 
+------+------+--------+---------+ 
| id | dr | deptid | visitno | 
+------+------+--------+---------+ 
| 1 | abc | dept1 |  1 | 
| 2 | abc | dept2 |  3 | 
| 3 | def | dept1 |  2 | 
+------+------+--------+---------+ 
3 rows in set (0.00 sec) 

Тогда соединяющую drdept к deptdocid должен дать нам то, что мы хотим

MariaDB [sandbox]> select dr.dr,dr.deptid,dr.visitno,s.deptid,s.docid,s.deptdocid 
    -> from drdept dr 
    -> left join 
    -> (
    -> select t.*, 
    -> if(t.deptid <> @p , @rn:=1,@rn:[email protected]+1) deptdocid, 
    -> @p:=t.deptid 
    -> from (select @rn:=0,@p:='') rn, t 
    -> order by t.deptid, t.id 
    ->) s on s.deptid = dr.deptid and s.deptdocid = dr.visitno; 
+------+--------+---------+--------+-------+-----------+ 
| dr | deptid | visitno | deptid | docid | deptdocid | 
+------+--------+---------+--------+-------+-----------+ 
| abc | dept1 |  1 | dept1 | Doc1 |   1 | 
| abc | dept2 |  3 | dept2 | Doc5 |   3 | 
| def | dept1 |  2 | dept1 | Doc2 |   2 | 
+------+--------+---------+--------+-------+-----------+ 
3 rows in set (0.00 sec) 

Очевидно, что вам необходимо поддерживать dr dept table и visitno, но после этого это довольно просто.

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