estrazione record precedente e successivo non consecutivi

Un saluto a tutto il forum!

Un altro rompiscatole è tra voi!!! :)

Ho fatto una ricerca tra i vecchi topic, ma o non sono riuscito a trovare le chiavi giuste, o il problema che vi sto per esporre non è stato trattato.

Ad ogni modo ecco il quesito.

Data la seguente query

$query = "SELECT id FROM tabella_1 WHERE ( id <".$id_ref." AND colonna_1 IS NULL AND colonna_2 = ".$valore.") OR ( id >".$id_ref."  AND colonna_1 IS NULL AND colonna_2 =".$valore.") ";
//che equivale a
$query = "SELECT id FROM tabella_1 WHERE ( id <>".$id_ref." AND colonna_1 IS NULL AND colonna_2 = ".$valore.") ";

che mi estrare i record precedenti e successivi al record indicato dalla varibile numerica $id_ref. Come posso limitare l'estrazione in modo che ottenga solo due righe?

Cioè il primo record precedente e successivo al valore indicato?

C'è un modo per fare ciò che ho in mente o è proprio sbagliato l'approccio?

Grazie dell'attenzione!

 :bye:

inviato 9 anni fa
kein
kein
1
X 0 X

L'ordinamento dei record è basato solo sul valore della colonna id?

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Ciao,

grazie della risposta.

L'ordinamento dei record è basato solo sul valore della colonna id?

Credo di si... Per ordinamento indendi le colonne indicizzate?

risposto 9 anni fa
kein
kein
1
X 0 X

Intendo dire qual'è la colonna che contiene i dati che determinano l'ordinamento dei record? Se vuoi ottenere il record precedente e successivo significa che ci sono una o più colonne che conservano dei dati attraverso i quali si capisce se un certo record viene prima o dopo di un'altro.

Nel tuo caso è la colonna id ad ordinare i record tra loro? Se è così ti bastano due query di questo tipo:

Record precedente:

[tt]SELECT * FROM  tabella_1 WHERE id < $id_ref ORDER BY id DESC LIMIT 1[/tt]

Record successivo:

[tt]SELECT * FROM  tabella_1 WHERE id > $id_ref ORDER BY id LIMIT 1[/tt]

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

eh eh

Gianni scusa ma sono un pò cotto.

Si è la colonna id a determinare l'ordinamento.

Quindi, stando a ciò che mi dici, la soluzione la si può trovare solo utilizzando due query...

La mia domanda nasceva proprio dal tentativo di accorparle in una sola, ma evidentemente non è possibile.

Se ti chiedi perché stavo facendo questo tentativo, ti rispondo che dipende dalle mie attuali conoscenze dei database. Ancora non riesco a capire come strutturare le query in modo da risparmiare risorse e impegnare al minimo il server. Ovvero, non sono mai sicuro di fare nel modo giusto.

Ad esempio in questo caso specifico mi sembrava che utilizzare una sola query fosse più corretto ma visto che i miei tentativi ed il tuo intervento mi confermano che non è possibile...

Beh, grazie dell'aiuto!  :)

Ciao!

risposto 9 anni fa
kein
kein
1
X 0 X

Non puoi farlo con una sola query poiché la tecnica prevede l'ordinamento dei risultati, ascendente per ottenere il record successivo e discendente per il record precedente.

Tieni presente inoltre che se in una query inserisci 2 distinti criteri di ricerca per ottenere 2 tipologie di record diverse, il tempo e le risorse necessarie non si discostano tanto da quelle necessarie per eseguire 2 query distinte.

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X

Grazie dell'uteriore chiarimento.

Tieni presente inoltre che se in una query inserisci 2 distinti criteri di ricerca per ottenere 2 tipologie di record diverse, il tempo e le risorse necessarie non si discostano tanto da quelle necessarie per eseguire 2 query distinte.

Quest'ultima informazione mi sarà utile anche per il futuro.

Mi piacerebbe approfondire questo aspetto, è troppo se ti chiedo qualche link, anche in inglese, che possa instradarmi sull'ottimizzazione delle query?

risposto 9 anni fa
kein
kein
1
X 0 X

Se vuoi approfondire l'argomento delle performance di MySQL non c'è che da consultare la documentazione ufficiale:

http://dev.mysql.com/doc/refman/5.0/en/optimization.html

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda