SQL: Найти следующую строку в предложении where с идентификатором

У меня есть таблица под названием products в базе данных MySQL. продукты выглядят примерно так:

id   name     din        strength active deleted
1    APA TEST 00246374   25       1      0
4    APA BOB  00246375   50       1      0
5    APA TIRE 00246888   50       1      0
7    APA ROT  00521414   100      1      0
9    APA APA  01142124   100      1      0
6    APA CODE 00121212   150      1      0
8    APA SERV 00011145   600      1      0

Очевидно, я пропустил несколько столбцов, не важных для моего вопроса. Когда я запрашиваю эту таблицу, я буду сортировать по одному из нескольких разных столбцов (пользовательский интерфейс позволяет отдельным пользователям изменять столбец сортировки и порядок), и у меня может быть предложение поиска, и в этом случае я сделаю предложение LIKE для ИМЯ и DIN.

Я хочу знать, учитывая информацию о сортировке и поиске, а также идентификатор конкретного продукта (скажем, я искал 004, который дал 3 результата, и я просматриваю один из них), как я могу получить следующий и предыдущий продукты?

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

Есть ли хороший и эффективный способ сделать это в SQL, или мне лучше использовать PHP? Также приветствуются любые идеи.

В настоящее время используется этот SQL-запрос, который вызывает проблемы, если я сортирую по столбцу сила , поскольку есть повторяющиеся значения.

SELECT T.*
FROM `wp_products` T
INNER JOIN `wp_products` curr on curr.id = 38
   AND ((T.strength = curr.strength and T.id < curr.id)
    OR (T.strength > curr.strength))
WHERE T.active = 1 AND T.deleted = 0 AND (T.name LIKE '%%' OR T.din LIKE '%%')
ORDER BY T.strength ASC, T.id ASC
LIMIT 1

Мой код PHP (с использованием WordPress) (разработан для получить следующий элемент)

    $sql = 'SELECT T.*
FROM `' . $wpdb->prefix . 'apsi_products` T
INNER JOIN `' . $wpdb->prefix . 'apsi_products` curr on curr.id = ' . $item->id . '
   AND ((T.' . $wpdb->escape( $query['orderby'] ) . ' = curr.' . $wpdb->escape( $query['orderby'] ) . ' and T.id > curr.id)
    OR (T.' . $wpdb->escape( $query['orderby'] ) . ' > curr.' . $wpdb->escape( $query['orderby'] ) . '))
WHERE T.active = 1 AND T.deleted = 0 AND (T.name LIKE \'%' . $query['where'] . '%\' OR T.din LIKE \'%' . $query['where'] . '%\')
ORDER BY T.' . $wpdb->escape( $query['orderby'] ) . ' ' . $query['order'] . ', T.id ASC
LIMIT 1;';
8
задан Brandon Wamboldt 1 February 2011 в 22:33
поделиться