PHP MySQL在下一个可用号码处停止循环

时间:2017-11-09 05:16:15

标签: php mysql

我有一个包含以下信息的数据库:

leavetype[0].payroll_leave_hours_cap

此表显示“Tom”和“James”阅读的书籍。

这些是我需要的要求:

  1. 显示未阅读的下一本书。 (例如,汤姆的'3'和詹姆斯的'1')

  2. 跳过书'1','10'和'15',因为这些不再可用。 (所以在James的案例中,下一本书将是'3')

  3. 如果不能连续播放,任何未阅读的随机图书都可以。

  4. 这就是我所做的:

    --------------
    id | Book | Names
    1  | 1    | Tom
    2  | 8    | James
    3  | 10   | Tom
    4  | 2    | Tom
    5  | 17   | James
    6  | 2    | James
    7  | 9    | James
    8  | 7    | Tom
    9  | 8    | Tom
    

    这是我有多远。所有帮助赞赏。感谢

2 个答案:

答案 0 :(得分:2)

在我的脑海中,日历表方法可能是在MySQL中完全解决此问题的一个很好的解决方案。首先定义一个序列表,其中包含从1到最高书ID的值(我称之为seq_table)。然后,为了找到给定用户未读取的最低书,一个简单的左连接将起到作用:

SELECT MIN(t1.Book) AS next_book
FROM seq_table t1
LEFT JOIN books t2
    ON t1.Book = t2.Book AND
       t2.Names = 'Tom'
WHERE
    t2.Book IS NULL;

如果您想要选择Tom不读的随机书,那么我们可以使用以下查询:

SELECT t1.Book AS next_book
FROM seq_table t1
LEFT JOIN books t2
    ON t1.Book = t2.Book AND
       t2.Names = 'Tom'
WHERE
    t2.Book IS NULL
ORDER BY RAND()
LIMIT 1;

答案 1 :(得分:0)

您需要另一张表来存储可用的书籍,例如books

---------------------------------------------
id | Book_Title             | Available
---------------------------------------------
1  | One million promises   | no
2  | Two towers             | yes
3  | Three musketeers       | yes
4  | 4th Avenue Cafe        | yes
5  | Famous Five            | yes
6  | Six million dollar man | yes
7  | Seven Stars            | yes
8  | Eighth Paladin         | yes
9  | Ninth Heaven           | yes

假设您的阅读书籍表名为read_books,您可以通过此查询获取Tom阅读的下一本书:

select min(id) from books where Available='yes' and id not in (select book from read_books where names = 'Tom')