我在 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 – Doc1
和 Doc2
。当客户第一次接近 dept1
时,应该先引导他到 Doc1
,然后再到 Doc2
,如果他再次想接近 dept1
获取更多文档,然后再次编码将其重定向到 Doc1
,反之亦然。
dept2
也应该发生同样的情况,它有 3 个 Docid
——Doc3
、Doc4
和 Doc5
。如果客户端第一次访问dept2
,那么MySQL应该首先将其指向Doc3
,然后是Doc4
,最后是Doc5
。如果客户已经接触了 dept2
中的所有文档,他应该再次被引导到 Doc3
,并且每当客户接近 dept2
时,整个循环就会再次进行。
我不知道如何编写查询或重组我的表列,以便每次我通过筛选部门明智地执行选择查询时都能获得下一个 Docid
。
请指导我为这个案例重构和编写 MySQL 查询。
感谢您提出宝贵的建议。
最佳答案
您可以使用行号模拟生成 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,但之后就非常简单了。
关于php - MySQL 查询获取下一条记录,如果存在则为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118281/