2011-03-05 20 views
6

¿Cuál es la mejor solución para hacer esto:MySQL Siguiente/Registro anterior

Tengo una consulta (por ejemplo SELECT * FROM products WHERE category = 12 ORDER BY price DESC) y el usuario hace clic en uno de los productos devueltos por esta consulta.

Por lo tanto, en este ejemplo, la consulta devuelve los productos 1,3,7,4,10,6,8,9 y 15. El usuario hace clic en el producto 10. Ahora quiero un "siguiente" y un enlace "anterior" al producto 6 y al producto 4.

¿Cómo puedo obtener esas dos ID?

+1

Puede capturar esas ID. Supongamos que almacena algo en la lista o en matrices. Y pase el siguiente y el anterior (usando indexación) a la plantilla como un valor de campo oculto. Y en las vistas puede pasar esos parámetros. Desde donde puede llamar a su método dbapi apropiado. – Tauquir

Respuesta

8

Primero debe tener en cuenta que su pedido es no bien definido.

Si dos objetos tienen el mismo precio, el orden relativo de estos dos elementos es indeterminado y podría cambiar de una consulta a otra. Por lo tanto, su pedido debe tener un desempate para garantizar que el pedido sea coherente. Si usted tiene un campo de ID se puede usar eso como un juego de desempate:

ORDER BY price DESC, id 

Implementar siguiente:

SELECT * 
FROM products 
WHERE category = 12 
AND price = (SELECT price FROM products WHERE id = 10) AND id > 10 
OR price > (SELECT price FROM products WHERE id = 10) 
ORDER BY price DESC, id 
LIMIT 1 

anterior es similar, pero con la condición y el orden inverso:

SELECT * 
FROM products 
WHERE category = 12 
AND price = (SELECT price FROM products WHERE id = 10) AND id < 10 
OR price < (SELECT price FROM products WHERE id = 10) 
ORDER BY price, id DESC 
LIMIT 1 
+0

Amigo, esta respuesta es genial. Busqué una respuesta, y la tuya es simple y funciona. La única pregunta que tengo es: con la cláusula OR como está, ¿no necesitarías paréntesis alrededor del primer "grupo" de precio e identificación? –

0

Dependiendo del marco que esté utilizando, debe concluir su consulta en una consulta de buscapersonas. Luego podrá obtener los botones siguiente y anterior.

Si está utilizando php claro entonces almacenar el producto actual en una variable llamada $current_id

SELECT * 
FROM products WHERE category = 12 
AND id > $current_id 
ORDER BY price DESC, id 
LIMIT 1 

para el próximo y

SELECT * 
FROM products WHERE category = 12 
AND id < $current_id 
ORDER BY price DESC, id 
LIMIT 1 

para la anterior.

+0

¿Funciona? No lo creo. ¿Qué pasa si mi pedido es 1,4,2,7, etc.? – Simon

1

Se podría aplicar el mismo principio que sugiere Gokul N K, excepto incluir el pedido completo y añadir un principio hasta el límite:

SELECT * FROM products WHERE category = 12 ORDER BY price, id DESC LIMIT 5, 5 

(En el ejemplo de producto 10 fue quinto en la lista). La vinculación al producto siguiente y anterior usaría exactamente la misma consulta simplemente incrementando o disminuyendo la restricción LIMIT.

De esta manera solo debe realizar un seguimiento de la cantidad total de elementos en la lista y cuál está viendo actualmente.

Tenga en cuenta que LIMIT M, N no tiene un gran rendimiento cuando M se vuelve grande.

Cuestiones relacionadas