2014-10-15 3 views
0

Вот упрощенный код, похожий на то, что я использую. В этом я вытаскиваю имена из идентификаторов.Предопределенный счетчик, не обновляющийся в операторе select

$counter = 0; 
$select = "SELECT nID,nName WHERE nID = $counter"; 
$result = sqlsrv_query($connection, $select); 

$maxusers = 10; 

while($counter<$maxusers) { 
    while($row = sqlsrv_fetch_array($result)) { 
     echo $row['nName']; 
    } 
$counter++ 
} 

Что я получаю такое же имя, счетчик в операторе отбора остается на 0.

я должен был поставить определение $ оператора выбора и $ результат внутри цикла, он переопределяет все, каждый раз, когда мы вводим цикл while, выглядит как код ниже. Это не кажется мне практичным и оптимальным. Каковы наилучшие условия для таких ситуаций? Я не очень хорошо знаком с областями переменных в PHP, я не нашел хорошей документации по этому вопросу, когда речь заходит о функциях sql.

$counter = 0; 
$maxusers = 10; 

while($counter<$maxusers) { 
$select = "SELECT nID,nName WHERE nID = $counter"; 
$result = sqlsrv_query($connection, $select); 
    while($row = sqlsrv_fetch_array($result)) { 
     echo $row['nName']; 
    } 
$counter++ 
} 

Вот код, который я на самом деле написал.

$selectFirst = "SELECT TOP 1 nDateTime,nUserID FROM TB_EVENT_LOG WHERE nUserID = $usercounter AND nDateTime BETWEEN $today AND $tomorrow"; 
$selectLast = "SELECT TOP 1 nDateTime,nUserID FROM TB_EVENT_LOG WHERE nUserID = $usercounter DateTime BETWEEN $today AND $tomorrow DESC"; 

$resultFirst = sqlsrv_query($bscon, $selectFirst);  
$resultLast = sqlsrv_query($bscon, $selectLast); 


$selectnumberofUsers = "SELECT TOP 1 nUserIdn FROM TB_USER ORDER by nUserIdn DESC"; 
$usersmaxq = sqlsrv_query($bscon, $selectnumberofUsers); 
$usersmax = sqlsrv_fetch_object($usersmaxq)->nUserIdn; 


while($usercounter<$usersmax){ 
    $usercounter = $usercounter + 1; 

    while($rowfirst = sqlsrv_fetch_array($resultFirst)) { 
     $intime = $rowfirst['nDateTime']; 
    } 
    echo $intime." ".$usercounter."<br />"; 
} 
+0

Это не точный код, который я использую. Я просто написал это как упрощение. Исправлено, спасибо. – masfrost

+1

Вам нужен счетчик? Не могли бы вы просто выбрать «WHERE nID> = $ min AND nID <$ maxusers»? – khartnett

+0

Это не работает. Мой реальный оператор select: '$ selectFirst =" SELECT TOP 1 nDateTime, nUserID FROM TB_EVENT_LOG WHERE nUserID = $ usercounter AND nDateTime BETWEEN $ today AND $ tomorrow ";'. Мне нужна первая запись только для каждого пользователя. Если есть способ получить только первую строку для каждого nUserID в моей инструкции select. – masfrost

ответ

0

Ваша проблема не связана с переменной областью. Переменная $ select устанавливается как строка с текущим значением $ counter. Второй пример работает, потому что это значение сбрасывается каждый раз. В вашем втором примере, однако, вы создаете оператор sql, который получает 1 строку (при условии, что nID уникален), а затем через ваш результат извлекается одна строка. Вы делаете 10 SQL звонки, но вам нужно только если вы измените запрос следующим образом:

$minusers = 0; 
$maxusers = 10; 

$select = "SELECT nID,nName WHERE nID >= $minusers AND nID < $maxusers ORDER BY nID"; 

$result = sqlsrv_query($connection, $select); 
while($row = sqlsrv_fetch_array($result)) { 
    echo $row['nName']; 
} 

Для самого кода, вы должны быть в состоянии получить одну запись за nUserId с помощью GROUP BY. Попробуйте следующее:

$selectFirst = "SELECT nDateTime,nUserID FROM TB_EVENT_LOG WHERE nUserID >= $usersmin AND nUserID <= $usersmax AND nDateTime BETWEEN $today AND $tomorrow GROUP BY nUserID"; 
+0

Это на самом деле неплохая идея. Единственная проблема заключается в том, что для каждого nID есть несколько записей, мне нужно первое nDateTime. Я отредактировал мой вопрос, чтобы включить код, который у меня есть до сих пор. – masfrost

+0

Я обновил свой ответ для вашего редактирования, надеюсь, что он будет работать – khartnett

+0

Я не мог использовать GROUP BY, потому что nDateTime не может быть агрегирован. Это несколько записей с разными отметками времени, и мне нужен только первый. Ваш ответ, однако, вдохновил меня на поиск правильного ответа. Я нашел это, чтобы сделать то, что мне нужно http://pastebin.com/RFzsfR3T Я получил это отсюда http://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by- group Я действительно не понимаю, как это работает, но я не буду использовать его, пока не сделаю. Благодарю. Нижняя линия: счетчики сосать! :) – masfrost

Смежные вопросы