MySQL 쿼리를 균일 한 결과로 제한
문제
MySQL 데이터베이스에서 짝수의 결과를 반환 해야하는 약간의 PHP 코드가 있습니다. 쿼리를 실행하기 위해 MySQLI Extension을 사용하고 있습니다.
내 코드는 현재 거의 다음과 같습니다.
//assume we already have a database connection
$query = "SELECT id
FROM movies
WHERE publish = 1
AND showimage = 1
ORDER BY date DESC
LIMIT 6";
$result = $connection->query($query);
while ($row = $result->fetch_assoc()) {
//do some stuff
}
보시다시피, 쿼리를 6 행으로 제한하지만 일부 조건에서는 더 적은 수의 반환됩니다. 3 행만 반환하면 마지막 줄을 버리고 2 만 유지하고 싶습니다.
MySQL 쿼리 또는 MySQLI에서 어떻게해야합니까?
해결책
나는 다음과 같은 것을 상상할 것이다 :
// row counter
$counter = 1;
// loop through each row
while($row = $result->fetch_assoc()) {
// If there is more than one row remaining
// OR if the current row can be divided by two
if (($result->num_rows - $counter) > 1 || ($counter % 2)) {
// result code for even rows
$counter++;
} else {
// break out of the loop
break;
}
}
다른 팁
아마도 SQL이 아닌 PHP에서 이것을 할 것입니다. 에서 while
-루프, 카운터를 유지하고 루프에서 나올 때 카운터가 있는지 확인하십시오. 이상하다면 마지막 반복의 결과를 버리십시오.
또 다른 옵션은 a COUNT
결과에 따라 쿼리를 변경하십시오.
SELECT COUNT(*) FROM movies WHERE publish = 1 AND showimage = 1
나는 PHP 사람이 아닙니다 (내가 그것을 본 지 몇 년이 지났습니다).
로스는 그것을 언급하지만 사용하고 싶습니다
$result->num_rows
루프 내에서 어떤 방식 으로든 결과를 처리하여 균일 한 수의 행을 유지합니다.
$ maxresults = $ result-> num_rows; if (($ maxresults % 2) = 1) $ maxresults-;
카운터가 $ maxresults와 동일하면 루프에서 벗어나십시오.
내 대답은 MySQL 전용이지만 아마도 최고는 아니지만 아마도 멋질 수도 있습니다. :-)
SELECT size INTO @count FROM (SELECT COUNT(*) as size FROM (SELECT * FROM table LIMIT 6) l) t;
SET @count = @count - (@count % 2);
PREPARE stmt_limit FROM 'SELECT * FROM table LIMIT ?';
EXECUTE stmt_limit USING @count;
DEALLOCATE PREPARE stmt_limit;
단계 :
- 첫 번째 문서에서 @Count 변수에 실제로 얼마나 많은 결과를 얻었는지
- 두 번째 문서에서는 변수가 고르지 않은 경우 변수를 줄입니다.
- 쿼리 및 자리 표시 자와 함께 제한을 준비하십시오
- 아기를 처형하십시오
- 거래를 할인, 이것이 필요한지 모르겠습니다
그러나 누가 알 수 있는지, 이것은 아마도 PHP 솔루션보다 더 빠를 것입니다 ...
가장 간단한 방법은 한 번에 두 줄을 잡는 것입니다.
while($row1 = $result->fetch_assoc() && $row2 = $result->fetch_assoc()) {
do_something_with($row1);
do_something_with($row2);
}
(PHP 사람이 아니라 다른 답변으로부터 구문을화물을 컬트합니다 ...)
샤키,
솔루션은 완벽하게 작동하지만 구문을 조금 수정해야합니다. 아래를 참조하십시오.
while(($row1 = $result->fetch_assoc()) && ($row2 = $result->fetch_assoc()))
{
do_something_with($row1);
do_something_with($row2);
}
다른 방법은 두 번째 행이 첫 번째 행을 취소하고 첫 번째 행을 표시하지 않습니다. 이제 두 결과를 모두 표시합니다. 멋진 간단한 솔루션, BTW.