Tengo una tabla llamada products
en una base de datos MySQL. products
se ve un poco de lo que de esta manera:SQL: busque la siguiente fila en una cláusula where con una ID
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
Obviamente He dejado de lado varias columnas no es importante para mi pregunta. Cuando consulto esta tabla, ordenaré por una de varias columnas diferentes (la interfaz de usuario permite a los usuarios individuales cambiar la columna y el orden de clasificación), y puedo tener una cláusula de búsqueda en cuyo caso haré una cláusula LIKE en NAME y DIN.
Lo que quiero saber es, dada la información de ordenación e información de búsqueda, y el ID de un producto específico (digamos que busqué 004, que arrojó 3 resultados, y estoy viendo uno de ellos), ¿cómo podría obtener los productos siguientes y anteriores?
Necesito hacer esto, porque si un usuario hace clic para editar/ver uno de los productos después de buscar y ordenar los resultados, quiere poder recorrer los resultados sin tener que ir a la página anterior.
¿Existe alguna manera buena y eficiente de hacer esto en SQL, o es mejor que use PHP? Cualquier idea también es bienvenida.
Actualmente el uso de esta consulta SQL, que está experimentando problemas si ordenar por la columna de la strength
ya que hay valores duplicados
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
Mi código PHP (usando WordPress) (diseñado para obtener el siguiente elemento)
$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;';
Lo siento, siempre he sido terrible con SQL. ¿Debo dejar referencias a CURR como están, o debería cambiar CURR y TABLE a los nombres de mi tabla? –
TABLE es un marcador de posición para el nombre de su tabla. CURR y T son alias: déjalos en paz. – RichardTheKiwi
No estoy teniendo éxito sin su consulta, más que probable que esté haciendo algo mal. Mi consulta tiene este aspecto: 'SELECT * FROM table_name WHERE active = 1 AND deleted = 0 ORDER BY din DESC' y cuando ejecuto su consulta, obtengo la primera fila devuelta por mi consulta aunque estoy usando la 5ª ID que me fue devuelta . Debería obtener la identificación 38 de la sexta identificación. Ideas? –