Ограничьте запрос MySQL четным числом результатов (используя PHP и mysqli) - PullRequest
1 голос
/ 17 января 2009

У меня есть немного кода 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
}

Как видите, я ограничиваю запрос 6 строками, но в некоторых случаях будет возвращено меньше. Если будет возвращено только 3 строки, я хочу выбросить последнюю строку и оставить только 2.

Как я могу сделать это в запросе MySQL или в mysli?

Заранее спасибо.

Ответы [ 8 ]

5 голосов
/ 17 января 2009

Я бы вообразил что-то вроде этого:

// 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;
    }
}
5 голосов
/ 17 января 2009

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

4 голосов
/ 17 января 2009

Другой вариант - запросить COUNT и изменить запрос в соответствии с результатом:

SELECT COUNT(*) FROM movies WHERE publish = 1 AND showimage = 1
2 голосов
/ 17 января 2009

$ maxResults = $ result-> num_rows; if (($ maxResults% 2) = 1) $ MaxResults -;

Если счетчик равен $ maxResults, вырваться из цикла.

2 голосов
/ 17 января 2009

Я не PHP человек (прошло уже много лет с тех пор, как я смотрел на него), но ....

Росс упоминает об этом, но вы хотите использовать

$result->num_rows

каким-то образом в вашем цикле, который обрабатывает результаты для сохранения четного числа строк.

1 голос
/ 06 апреля 2010

Шарки,

Ваше решение будет работать отлично, но вам нужно немного изменить синтаксис. Смотри ниже.

while(($row1 = $result->fetch_assoc()) && ($row2 = $result->fetch_assoc()))
{ 
    do_something_with($row1); 
    do_something_with($row2); 
} 

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

1 голос
/ 18 апреля 2009

Самый простой способ - просто взять две строки за раз:

while($row1 = $result->fetch_assoc() && $row2 = $result->fetch_assoc()) {
    do_something_with($row1);
    do_something_with($row2);
}

(Не человек PHP, но грузоподобный синтаксис из других ответов ...)

1 голос
/ 17 января 2009

Мой ответ только 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 ...

...