2012-09-14 17 views
5

selezionato. Proverò a chiarire questo punto.MySQL: selezionare una riga, quindi una successiva e una precedente rispetto allo

Devo selezionare una riga specifica e un parente precedente di una riga da quella riga selezionata e una riga successiva relativa da quella riga selezionata senza usare id. È possibile? Precedente e successivo, in breve.

Il motivo per cui non posso (forse non so come) utilizzare l'id, è perché non sono in ordine sequenziale. Hanno degli spazi, come puoi vedere da questo esempio piuttosto immaturo e casuale.

TABLE <-the name of the table 
+----+----------------------+-------+ 
| id | name     | value | 
+----+----------------------+-------+ 
| 1 | some_name   | asf | 
+----+----------------------+-------+ 
| 4 | hello    | A3r | 
+----+----------------------+-------+ 
| 5 | how_do_you_do  | HR5 | 
+----+----------------------+-------+ 
| 8 | not_bad    | 00D | 
+----+----------------------+-------+ 
| 12 | i_like_women   | lla | 
+----+----------------------+-------+ 
| 13 | are_you_serious  | 1Ha | 
+----+----------------------+-------+ 
| 15 | nah_i_kid   | Ad4 | 
+----+----------------------+-------+ 
| 17 | it_is_just_the_boobs | Zc5 | 
+----+----------------------+-------+ 
| 18 | thank_god   | 102 | 
+----+----------------------+-------+ 
| 44 | no_kidding   | jjy | 
+----+----------------------+-------+ 

In primo luogo, ho bisogno di selezionare una riga in base al valore specifico da una delle sue colonne. So come farlo:

SELECT `value` 
FROM `TABLE` 
WHERE name = 'i_like_women' 

Questo selezionerà una riga con ID 12 con il valore lla.

Quello che mi serve è selezionare un altro almeno due righe: una con il nome 'not_bad' e una con il nome 'are_you_serious' senza specificarlo. O, in altre parole, precedente e successivo rispetto a questo selezionato.

In breve, è necessario selezionare tre righe in base a un valore. Sono nuovo di MySQL, come puoi immaginare.

Grazie per il vostro tempo e attenzione. Mi piace aiutarmi.

+0

Questo post può essere voi http://stackoverflow.com/questions/1813641/select-a-row-and-rows-around-it – Jhonathan

+2

uomo, mi piace questo sito. – VolosBlur

risposta

7

Il modo più semplice per farlo è quello di sfruttare il fatto che, anche se non continuo , i tuoi ID sono in ordine crescente.

Ad esempio:

SELECT * FROM Table WHERE id = 8 

UNION 
--Select the first item less than 8 
SELECT * FROM Table WHERE id = (SELECT MAX(id) FROM Table WHERE id < 8) 

UNION 
--select the first item greater than 8 
SELECT * FROM Table WHERE id = (SELECT MIN(id) FROM Table WHERE id > 8) 

Se si conosce solo la stringa, quindi:

DECLARE _id INT 

SELECT _id = id FROM Table WHERE value = 'i_like_women' 

allora si può semplicemente alimentare questa _id nella query di cui sopra, invece di 8.

Nota che non è necessario usare `per delimitare i nomi di tabelle e colonne.

+0

Sì. Penso che questo funzioni. seleziona una riga specifica e due sugli "altri lati". Grazie mille! – VolosBlur

4

quello prima può essere recuperato con:

SELECT `value` 
FROM `TABLE` 
WHERE id < (SELECT id FROM `TABLE` WHERE name = 'i_like_women') 
ORDER BY id DESC 
LIMIT 1 

Si può fare la query opposta per trovare il prossimo

+0

Anche questo funziona. Puoi "UNION" la "query opposta" con questa? – VolosBlur

+0

@VolosBlur Sì. – Tchoupi

+0

Funziona per me !! Grazie –

9

Ecco la query che restituirà tutti e tre i record.

SELECT * 
FROM `TABLE` 
WHERE id >= (
    SELECT id 
    FROM `TABLE` 
    WHERE id < (SELECT id FROM `TABLE` WHERE name = 'i_like_women') 
    ORDER BY id DESC 
    LIMIT 1 
) 
ORDER BY id ASC 
LIMIT 3 
+2

A seconda di ciò che vuole il richiedente, questo potrebbe non funzionare per il primo record; porterai 3 indietro anziché 2, o forse niente perché non c'è id <1. Altrimenti, bel approccio! – dash

+0

Ma funziona. PS ho fatto. – VolosBlur

+0

@VolosBlur Cool - Anch'io ho fatto :-) Sono sorpreso che funzioni anche se ci si nutre di 'some_name'. – dash

1

questa query sta lavorando bene sul primo e l'ultimo record di oltre

SELECT * FROM `products` WHERE `ProductId` = (SELECT MAX(ProductId) FROM `products` WHERE ProductId < 1) AND SubCategoryId=1 


UNION 

SELECT * FROM `products` WHERE `ProductId` = (SELECT MIN(ProductId) FROM `products` WHERE ProductId > 1) AND SubCategoryId=1 


UNION 

SELECT * FROM `products` WHERE `ProductId` = (SELECT MIN(ProductId) FROM `products` WHERE ProductId < 1) AND SubCategoryId=1 


UNION 

SELECT * FROM `products` WHERE `ProductId` = (SELECT MAX(ProductId) FROM `products` WHERE ProductId > 1) AND SubCategoryId=1 


ORDER BY ProductId ASC 

Spero che questo risolverà il vostro problema :)

1

ho trovato migliore e più facile risposta per la domanda qui sotto (trovando successivo e precedente fila),

$neighbors = $this->WorkDescription->find('neighbors',array('field' => 'id', 'value' => 3)); 

lo farà un output come questo-

Array 
(
    [prev] => Array 
     (
      [WorkDescription] => Array 
       (
        [id] => 1 
        [title] => Twenty 
        [ter_id] => 1 
        [cat_id] => 4  
        [writer] => abk 
        [director] => Dir 
        [producer] => pro 
       ) 
     ) 

    [next] => Array 
     (
      [WorkDescription] => Array 
       (
        [id] => 3 
        [title] => The Piper 
        [ter_id] => 1 
        [cat_id] => 3   
        [writer] => abk 
        [director] => Dir 
        [producer] => pro 
       ) 
      ) 
) 
Problemi correlati