Ограничьте запрос MySQL четным количеством результатов.

StackOverflow https://stackoverflow.com/questions/453245

Вопрос

У меня есть немного PHP-кода, который мне нужен для возврата четного количества результатов из базы данных MySQL.Я использую расширение mysqli для выполнения моего запроса.

Мой код на данный момент примерно такой:

//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
}

Как видите, я ограничиваю запрос шестью строками, но в некоторых случаях будет возвращено меньшее количество строк.Если возвращаются только 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;
    }
}

Другие советы

Я бы сделал это на PHP, а не на SQL. В цикле while - сохраните счетчик, а когда выйдете из цикла, проверьте, есть ли счетчик. Если это странно, отбросьте результаты последней итерации.

Другой вариант - запросить 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;

Шаги:

  1. В первом операторе я указываю, сколько результатов вы действительно получили, в переменную @count.
  2. Во втором операторе я уменьшаю переменную на единицу, если она нечетная.
  3. Подготовьте заявление с вашим запросом и заполнителем для лимита.
  4. Казнить ребенка
  5. Освободить, не знаю, нужно ли это

Но кто знает, возможно, это быстрее, чем решения на 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); 
} 

В противном случае ваша вторая строка отменит первую строку и не отобразит первую.Теперь он отобразит оба результата.Хорошее простое решение, кстати.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top