MySQL Query Help: Получение содержимого из связанной таблицы с позицией - PullRequest
1 голос
/ 07 марта 2012

Что мне нужно сделать

  • У меня есть две таблицы: "главы" и "страницы".
  • В каждой главе много страниц.
  • Главы отсортированы по столбцу позиции.
  • Страницы отсортированы по столбцу позиции относительно его главы. Таким образом, первая страница в каждой главе имеет позицию 1.
  • Мне нужно получить 3 страницы до и после (если есть 3 страницы до / после текущей страницы. То есть - на странице 2 есть только 1 страница до текущей)
  • У меня есть только атрибуты 'name' для текущей главы и 'name' для текущей страницы.
  • Я использую PHP и MySQL

Таблица "главы"

  • ID
  • имя
  • положение

Таблица "страниц"

  • ID
  • chapter_id
  • имя
  • положение

Как мне создать запрос, который будет возвращать ассоциативный массив страниц, чтобы у меня было что-то вроде следующего (Примечание: я могу использовать php для выполнения серии запросов, если это необходимо):

  • страницы [0] [ "ID"]
  • страницы [0] [ "имя"]
  • страницы [0] [ "chapter_name"]

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 марта 2012

если вы можете изменить таблицы, почему бы не добавить столбец порядка в таблицу страниц?

вместо использования int и необходимости перемещать все каждый раз, когда вы вставляете новую страницу, вы также можете использоватьdouble и просто используйте среднее значение между этой и следующей страницей.

0 голосов
/ 07 марта 2012
$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");

Теперь просто извлеките этот запрос и убедитесь, что вы игнорируете текущую страницу из этого массива.

0 голосов
/ 07 марта 2012

Я думаю, что вы ищете такой запрос:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...