Forward Back Records in MySQL con gli stessi DATA nel primario

Ho una tabella che è ordinata 1 per promemory data poi ID

Tabella Assomiglia a:

ID | remind_date 1 2011-01-23 2 2010-02-21 4 2011-04-04 5 2011-04-04 6 2009-05-04 

Sto usando un front-end PHP per andare avanti e indietro nei record. Voglio avere i pulsanti avanti e indietro, ma sto incontrando un problema con le 2 date di promemory che sono le stesse.

Solo per notare che gli ID NON sono in ordine, sono qui ma nel database attuale sono confusi quando si ordina per promemory_data

L'istruzione select che sto utilizzando è: ($ iid è il record corrente in cui sono)

 SELECT id FROM myDB.reminders where remind_date > (SELECT remind_date FROM myDB.reminders where id=$iid) order by remind_date ASC LIMIT 1 

Quindi, ciò che accade quando arrivo alle date che sono le stesse salta più di una perché richiede il promemory>.

Se uso remind_date> = restituisce il record corrente. La mia soluzione era quindi quella di utilizzare il limite 2 e controllare tramite PHP se il primo record = il mio ID corrente, se ha usato il successivo. ma quello che ci sono 3 date lo stesso o 4 ecc.

Ho anche pensato di utilizzare il field ID, ma dal momento che sono fuori uso non posso aggiungere un ID> $ iid.

Qualche idea? Funziona benissimo tranne che per 2 date uguali.

Potresti essere in grado di usare questo:

 SELECT ID, remind_date FROM ( SELECT @prev_id := -1 ) AS vars STRAIGHT_JOIN ( SELECT ID, remind_date, @prev_id AS prev_id, @prev_id := id FROM myDB.reminders ORDER BY remind_date, ID ) T1 WHERE prev_id = $iid 

Ecco un test di quanto sopra con i tuoi dati di test dal tuo commento:

 CREATE TABLE Table1 (ID INT NOT NULL, remind_date DATE NOT NULL); INSERT INTO Table1 (ID, remind_date) VALUES (45, '2011-01-14'), (23, '2011-01-22'), (48, '2011-01-23'), (25, '2011-01-23'), (63, '2011-02-19'); SELECT ID, remind_date FROM ( SELECT @prev_id := -1 ) AS vars STRAIGHT_JOIN ( SELECT ID, remind_date, @prev_id AS prev_id, @prev_id := id FROM table1 ORDER BY remind_date, ID ) T1 WHERE prev_id = 25 

Risultato:

 ID remind_date
 48 2011-01-23

aggiungi una condizione WHERE ID <> MY_LAST_ID. Questo non può funzionare con tre o più date uguali, quindi puoi raccogliere ID già presi come arrays (4,5,6) – vedi arrays_push (), implodalo con "," per convertirlo in una string (chiamiamola YOUR_IDS_STRING ) e aggiungere alla tua query:

 WHERE id NOT IN( YOUR_IDS_STRING ) 

E dopo che each query ha fatto il check, la data è cambiata e se lo fa – puoi disinserire il tuo arrays e iniziare dall'inizio (questo non è necessario, ma ti dà più performance, perché YOUR_ID_STRING sarà lungo solo quanto è necessario).

Se la tua pagina si sta aggiornando tra le query, forse prova a spingere YOUR_ID_STRING nella variabile di session, _GET o cookie e concatena semplicemente il prossimo id per operatore. =

Ho usato il codice fornito da Mark Byers e con piccole modifiche l'ho adattato per navigare in direzioni opposte (e per passare anche altre colonne, non solo la data e l'ID):

$results = $mysqli->query("SELECT * FROM (SELECT @prev_id := -1) AS vars STRAIGHT_JOIN (SELECT *, @prev_id AS prev_id, @prev_id := ID FROM my_table ORDER BY data, ID) T1 WHERE prev_id = ".$ID);

$results = $mysqli->query("SELECT * FROM (SELECT @next_id := 1) AS vars STRAIGHT_JOIN (SELECT *, @next_id AS next_id, @next_id := ID FROM my_table ORDER BY data DESC, ID DESC) T1 WHERE next_id = ".$ID);

L'ho provato su date doppie e naviga bene attraverso un elenco di record visualizzati con:

$results = $mysqli->query("SELECT * FROM my_table ORDER BY data DESC, ID DESC");