2012-12-31 8 views
5

ho questa query di esempio:Come per andare a prendere 2 volte in MySQL DOP senza fetchAll

$STH = $DBH->query("SELECT id FROM table"); 

voglio ottenere la prima fila e poi loop e visualizzare tutte le righe. Quindi io uso il seguente per ottenere la prima fila:

$STH->setFetchMode(PDO::FETCH_ASSOC); 
$first_row = $STH->fetch(); 
$first_row = $first_row['id']; 

Io uso ciclo while per visualizzare nuovamente tutte le righe:

while ($list = $STH->fetch()) {  
$id = $list['id']; 
echo $id; 
} 

Ora l'mentre salta la prima riga e lo voglio per essere visualizzato. Esiste un equivalente a mysql_data_seek per reimpostare il puntatore di nuovo sulla prima riga? So che lo fetchall può essere usato ma è cattivo in memoria e sprecone. Potrei anche eseguire la query e limitare a 1, ma questo non è consigliato in quanto ho una query che unisce più tabelle e sarebbe molto lento. c'è un'altra soluzione?

Grazie

risposta

5

lo prendo di nuovo sembra è possibile utilizzare i contants orientamento del cursore per selezionare il risultato ... codice di esempio in arrivo ... Non l'ho provato, quindi potresti aver bisogno di giocare un po '. Ciò si basa anche sul presupposto che un PDO::FETCH_ORI_FIRST si comporta come una data_seek e lascia il cursore sulla prima posizione anziché restituirlo a qualsiasi cosa fosse prima.

$stmt = $pdo->prepare('SELECT id FROM table', array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL)); 
$stmt->execute(); 

$first = $pdo->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_FIRST); 
$first_row = $first['id']; 

// other stuff 

// first iteration we rewind to the first record; 
$cursor = PDO::FETCH_ORI_FIRST; 

while (false !== ($row = $stmt->fetch(PDO::FETCH_ASSOC, $cursor))) { 
    $id = $row['id']; 
    // successive iterations we hit the "next" record 
    $cursor = PDO::FETCH_ORI_NEXT; 
    echo $id; 
} 

io non credo che si può riavvolgere una dichiarazione ... Supponendo che questi blocchi arent seprated da un gruppo di intermediari logica id basta farlo nel ciclo.

$STH->setFetchMode(PDO::FETCH_COLUMN); // no need to pull an array 
$count = 0; 
while ($id = $STH->fetch()) {  
    if($count === 0) { 
    $first_row = $id; 
    } 
    echo $id; 
    $count++; 
} 
+0

Ho bisogno che sia in una matrice per utilizzare tutte le righe anche ho bisogno di visualizzare la prima riga prima del tempo per usarlo per un altro scopo ... grazie :) –

+0

Beh hai selezionato solo l'id 'nel tuo esempio. .. – prodigitalson

+0

questa è solo una query semplificata per spiegare il problema ... la query è molto più grande di quella –

1

Potresti usare un ciclo do...while invece?

$STH->setFetchMode(PDO::FETCH_ASSOC); 
$list = $STH->fetch(); 
$first_id = $list['id']; 

do { 
    $id = $list['id']; 
    echo $id; 
} while ($list = $STH->fetch()); 
+0

per qualche motivo questo ignora ORDER BY nella query ... grazie :) –

+0

@ Michael - davvero? Non sto vedendo come questo potrebbe avere alcun effetto sull'ordine '' nella query ... –

+0

non so anche perché questo accade .. sto ordinando da desc ma ora viene visualizzato come ascendente –

1

È possibile recuperare tutto il risultato, quindi agire come array. Così, per esempio, si potrebbe spostare il primo risultato fuori la parte anteriore, e quindi un ciclo su tutte le righe aggiuntive:

<?php 

$sql = "YOUR QUERY"; 
$stmt = $pdo->prepare($sql); 
$stmt->execute(); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 

// get first row 
$firstRow = array_shift($rows); 

// loop over remaining rows 
foreach ($rows as $row) { 
    // do something 
} 
+0

Penso che lui specificamente volevo una risposta che evitasse di usare 'fetchall' –

+0

ma fetchALL spreca memoria dall'esperienza degli altri ... grazie :) –

+0

@MichaelSamuel Perché? Hai prove del benchmark che 'fetchAll()' è "brutto sulla memoria" e "dispendioso", o stai semplicemente andando su quello che hai letto altrove? Immagino che 'fetchAll()' sia migliore di molti 'fetch()' s. –