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

标签 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 个 Docids – Doc1Doc2。当客户第一次接近 dept1 时,应该先引导他到 Doc1,然后再到 Doc2,如果他再次想接近 dept1 获取更多文档,然后再次编码将其重定向到 Doc1 ,反之亦然。

dept2 也应该发生同样的情况,它有 3 个 Docid——Doc3Doc4Doc5。如果客户端第一次访问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/

相关文章:

php - fatal error :调用未定义的方法 PDO::error()

MySQL为每个类别选择前N行

python - 在 SQLAlchemy 中禁用提交对象更改

mysql - 在 SQL 中将行转换为列

mysql - mysql同一个查询多个表

javascript - 将 Javascript 值发送到 MySQL 数据库

php - 将表单中的多个字段插入数据库中的单个字段

php - 检索特定行的 SQL 问题

php - 没有从数据库中获取所有行

php - 当我打开编辑页面时,使所选数据默认在列表中选择