我在MySQL中有以下表结构,我必须编写代码
id Docid deptid
-------------------
1 Doc1 dept1
2 Doc2 dept1
3 Doc3 dept2
4 Doc4 dept2
5 Doc5 dept2
我必须编写一个查询来以上述MySQL结构的顺序方式获取Docid
,这样当客户端接近dept1
时,它有2 Docid
s - { {1}}和Doc1
。当客户第一次接近Doc2
时,应先将其引导至dept1
,然后转至Doc1
,如果他再次希望接近Doc2
以获取更多文档,则代码再次将其重定向到dept1
,反之亦然。
Doc1
也应如此,其中包含3 dept2
s - Docid
,Doc3
和Doc4
。如果客户端第一次接近Doc5
,则MySQL应先将其引导至dept2
,然后引导至Doc3
并最后转至Doc4
。如果客户已接近Doc5
中的所有文档,则应再次将其定向到dept2
,并且每当客户端接近Doc3
时,整个周期将再次发生。
我没有得到如何编写查询或重构我的表列,以便每次通过过滤部门执行选择查询时,我都可以获得下一个dept2
。
请指导我重组并编写针对此案例的MySQL查询。
感谢您提出的所有宝贵建议。
答案 0 :(得分: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:=@rn+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:=@rn+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)
显然你需要维护drdept表和visitno,但之后它非常简单。