Ограничьте запрос MySQL четным количеством результатов.
Вопрос
У меня есть немного 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;
Шаги:
- В первом операторе я указываю, сколько результатов вы действительно получили, в переменную @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);
}
В противном случае ваша вторая строка отменит первую строку и не отобразит первую.Теперь он отобразит оба результата.Хорошее простое решение, кстати.