1

我需要做什么

  • 我有两个表,“章节”和“页面”。
  • 每章有很多页。
  • 章节按位置列排序。
  • 页面按相对于其章节的位置列排序。所以每一章的第一页的位置都是1。
  • 我需要获取之前和之后的 3 页(如果当前页面之前/之后有 3 页。即 - 在第 2 页上,当前页面之前只有 1 页)
  • 我只有当前章节的“名称”和当前页面的“名称”属性。
  • 我正在使用 PHP 和 MySQL

“章节”表

  • ID
  • 姓名
  • 位置

“页”表

  • ID
  • 章节编号
  • 姓名
  • 位置

如何构造一个将返回页面关联数组的查询,以便我有如下内容(注意:如果需要,我可以使用 php 执行一系列查询):

  • 页数[0][“id”]
  • 页数[0][“名称”]
  • 页[0][“章节名”]

谢谢!

4

3 回答 3

0

我认为您正在寻找这样的查询:

SELECT
    pages.id AS page_id,
    pages.name AS page_name,
    chapters.name AS page_chapter
FROM pages
INNER JOIN chapters ON (chapters.id = pages.chapter_id)
WHERE pages_id IN
    (page_id -3, page_id - 2, page_id - 1, page_id,
    page_id + 1, page_id + 2, page_id + 3)
ORDER BY page_id ASC
于 2012-03-06T20:53:22.030 回答
0

如果您可以更改表格,为什么不在 pages 表格中添加一个排序列呢?

而不是使用 anint并且每次插入新页面时都必须移动所有内容,您还可以使用 adouble并且只使用此页面和下一页之间的中间值。

于 2012-03-06T20:54:10.140 回答
0
$cChapter = 5; //Current chapter's id
$cPage = 4; //Current page's id

//$PagePos = the current's page position (when 1 is the first page , not 0)
//$MaxPosExists = the highest position value for the current chapter
$range = 3; //3 pages before and 3 pages after

$minPosition = $PagePos - $range;
$maxPosition = $PagePos + $range;

if($minPosition <= 0)
{
 $minPosition = 1; //the current page is the first,second or third page.
}

if($maxPosition > $MaxPosExists)
{
 $maxPosition = $MaxPosExists;
}


$getPages = mysql_query("SELECT * FROM pages WHERE chapter_id='$cChapter' AND position BETWEEN $minPosition AND $maxPosition ORDER BY position ASC");

现在,只需获取该查询并确保您忽略了该数组中的当前页面。

于 2012-03-06T20:55:19.313 回答