@GDim

Как сделать чтобы LIMIT лимит игнорировал повторяющиеся значения?

Есть таблица MySql c 20 000+ записями

id |     date  | name | cash
----------------------------
1 | 2014-02-05 | Ivan  | 140
2 | 2014-02-05 | Kate  | 130
3 | 2014-02-05 | Sasha | 14
4 | 2014-02-05 | Sveta | 140
5 | 2014-02-05 | Nina  | 140
6 | 2014-02-05 | Jenya | 140
7 | 2015-01-05 | Ivan  | 140
8 | 2015-01-05 | Sveta | 140
9 | 2015-06-15 | Kate | 140
10| 2015-07-20 | Kate | 4


Нужно сделать для реализации пагинации выборку записей с определенным шагом по дате.
Например:
$count = 2;// Количество записей на странице
$page = 1; // Узнаём номер страницы
$shift = $count * ($page - 1); // Смещение в LIMIT. Те записи, порядковый номер которого больше этого числа, будут выводиться.
$startDate = '2014-02-01';
$endDate = '2015-06-02';

SELECT `date`, `name`, `cash` FROM `stats` WHERE `date` BETWEEN $startDate AND $endDate ORDER BY `date` ASC LIMIT $shift, $count


вернет только две записи из таблицы, а нужно чтобы лимит учитывал только уникальные значения, не учитывая повторяющиеся. Т.е., грубо говоря, чтобы LIMIT 0,2 вернул что-то вроде

1 | 2014-02-05 | Ivan  | 140
2 | 2014-02-05 | Kate  | 130
3 | 2014-02-05 | Sasha | 14
4 | 2014-02-05 | Sveta | 140
5 | 2014-02-05 | Nina  | 140
6 | 2014-02-05 | Jenya | 140
7 | 2015-01-05 | Ivan  | 140
8 | 2015-01-05 | Sveta | 140


PS Т.е. нужно вывести все записи за $count дней со сдвигом $shift дней
  • Вопрос задан
  • 356 просмотров
Решения вопроса 1
@GDim Автор вопроса
Решил с помощью php функции
public function calculateBetweenForPagination($page = 1, $startDate, $endDate)
    {
        $count = 15; // Количество записей на странице
        $shift = $count * ($page - 1);

        $from = clone($startDate->modify('+'.$shift.' day'));
        $to = clone($startDate->modify('+'.$count - 1 .' day'));

        if ($endDate < $to)
        {
            $to = $endDate;
        }
        $between['from'] = $from;
        $between['to'] = $to;

        return $between;
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Копайте в сторону group by
Ответ написан
Комментировать
nwur
@nwur
Network engineer. And something else.
group by
SELECT `date`, `name`, `cash` FROM `stats` WHERE `date` BETWEEN $startDate AND $endDate ORDER BY `date` ASC  group by `name` LIMIT $shift, $count

или distinct
SELECT `date`, distinct `name`, `cash` FROM `stats` WHERE `date` BETWEEN $startDate AND $endDate ORDER BY `date` ASC LIMIT $shift, $count
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы