如果存在,则MySQL查询获取下一条记录0

时间:2016-12-13 10:03:03

标签: php mysql

我在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 - DocidDoc3Doc4。如果客户端第一次接近Doc5,则MySQL应先将其引导至dept2,然后引导至Doc3并最后转至Doc4。如果客户已接近Doc5中的所有文档,则应再次将其定向到dept2,并且每当客户端接近Doc3时,整个周期将再次发生。

我没有得到如何编写查询或重构我的表列,以便每次通过过滤部门执行选择查询时,我都可以获得下一个dept2

请指导我重组并编写针对此案例的MySQL查询。

感谢您提出的所有宝贵建议。

1 个答案:

答案 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,但之后它非常简单。