PHP MySQL在下一个可用编号处停止循环
我有一个包含以下信息的数据库:PHP MySQL在下一个可用编号处停止循环,php,mysql,Php,Mysql,我有一个包含以下信息的数据库: -------------- 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 这张表显示了“汤姆”和“詹姆斯”读的书 以下是我需要的要求: 显示未阅读的下一本书。(例如,汤姆
--------------
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
这张表显示了“汤姆”和“詹姆斯”读的书
以下是我需要的要求:
$sql = "Select * FROM books Group By names";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$sql1 = "SELECT * FROM books WHERE names = '" . $row["names"]. "' ORDER BY book ASC";
$result1 = $conn->query($sql1);
if ($result1->num_rows > 0) {
$newbook = '1';
// output data of each row
while($row1 = $result1->fetch_assoc()) {
if ($row1["book"] == $newbook) {
echo "Exist<br><br>";
$newbook = $newbook+ 1;
} else {
if ($row1["book"] == '1' || $row1["book"] == '10' || $row1["book"] == '17') {
$newbook= $newbook+ 1;
} else {
echo "Add".$newbook."<br><br>";
break;
}
}
}
}
}
}
$sql=“按名称从图书组中选择*”;
$result=$conn->query($sql);
如果($result->num_rows>0){
//每行的输出数据
而($row=$result->fetch_assoc()){
$sql1=“从名称为“”的图书中选择*”$row[“名称”]。““按图书ASC排序”;
$result1=$conn->query($sql1);
如果($result1->num\u rows>0){
$newbook='1';
//每行的输出数据
而($row1=$result1->fetch_assoc()){
如果($row1[“book”]==$newbook){
回声“存在
”;
$newbook=$newbook+1;
}否则{
如果($row1[“book”]=“1”| |$row1[“book”]=“10”| |$row1[“book”]=“17”){
$newbook=$newbook+1;
}否则{
回显“添加”。$newbook。“
”;
打破
}
}
}
}
}
}
这就是我能走多远。谢谢你的帮助。非常感谢,在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;
在我看来,日历表方法可能是一个很好的解决方案,可以在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;
您将需要另一个表来存储可用的书籍,比如说
books
table
---------------------------------------------
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表名为read\u books
,您可以通过此查询获得Tom要阅读的下一本书:
select min(id) from books where Available='yes' and id not in (select book from read_books where names = 'Tom')
您将需要另一个表来存储可用的书籍,比如说
books
table
---------------------------------------------
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表名为read\u books
,您可以通过此查询获得Tom要阅读的下一本书:
select min(id) from books where Available='yes' and id not in (select book from read_books where names = 'Tom')
您遗漏了第一个sql字符串中的SELECT。你从脚本中得到了什么输出?我从第一次选择中得到了两个结果。Tom和Jamesyou遗漏了第一个sql字符串中的SELECT。你从脚本中得到了什么输出?我从第一次选择中得到了两个结果。汤姆,还有杰姆斯“书”表就是你所指的“读书”表。我有另一个可用书籍表,可以通过book ID链接。“book”表就是您所指的read_books表。我有另一个表,可以通过book idRandom链接可用的书籍,但它不起作用。它选择所有已读/未读的书籍。如果你能修改它,那将是great@AndrewTsang我的第二个查询绝对返回一条随机记录。也许你的数据有问题,但随机的不起作用。它选择所有已读/未读的书籍。如果你能修改它,那将是great@AndrewTsang我的第二个查询绝对返回一条随机记录。也许你的数据有问题。