Получить количество записей в MySQL

iNfantry

Новичок
Дело так, есть запрос который вытягивает записи из базы (фильмы + количество сеансов по каждому фильму, это не особо важно, просто обычный лефт джойн двух таблиц с группировкой).

SELECT `id`, `title`, `pic_ext`, `ctime`, COUNT(`film_id`) AS `sessions_count` FROM films LEFT JOIN films_sessions ON (`id`=`film_id`) GROUP BY `id` HAVING (`ctime`>'1369837625' OR `sessions_count`>'0') ORDER BY `sessions_count` DESC, `ctime` DESC

Всё работает прекрасно, но возникла необходимость заранее получить число записей которые должен вернуть этот запрос. Как это ПРАВИЛЬНО сделать с помощью COUNT()? Лично у меня вызывает затруднение в составлении этого запроса наличие HAVING в оригинальном запросе, сам никак не могу допереть.

Таблица с фильмами:

CREATE TABLE `films`(
`id` INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
`title` VARCHAR(100),
`pic_ext` CHAR(3),
`ctime` VARCHAR(15),
) DEFAULT CHARACTER SET \'UTF8\' DEFAULT COLLATE \'utf8_general_ci\'


Таблица с сеансами:

CREATE TABLE `films_sessions`(
`film_id` INT,
`start_date` DATE,
`end_date` DATE,
`sessions` TEXT
)
 
Последнее редактирование:

iNfantry

Новичок
Если непонятно готов подробнее объяснить, очень нужна помощь. (
 

Gas

может по одной?
Фанат
Постраничная разбивка?

iNfantry
Мне кажется, тебе нужно вместо left join и having sessions_count сделать просто join, условие по crime в where перенести. Что касается количества - выполнить тот же запрос без перечисления полей, с одним count и без сортировки/лимита, ну или попробовать sql_calc_found_rows
 

iNfantry

Новичок
Мне кажется, тебе нужно вместо left join и having sessions_count сделать просто join, условие по crime в where перенести. Что касается количества - выполнить тот же запрос без перечисления полей, с одним count и без сортировки/лимита, ну или попробовать sql_calc_found_rows
Лефт Жойн используется потому что для какихто фильмов сеансов может не быть, что допустимо.
Насчет перенести в where условие к сожалению тоже нельзя, нужно чтобы сработало такое условие - взять фильмы не пожже какойто даты добавления ИЛИ если для них есть сеансы (тоесть COUNT(`film_id')>'0').
Всё легко бы было, если бы не HAVING, а он в данной ситуации необходим. (
Про sql_calc_found_rows не слышал, но что-то мне кажется это смахивает на костыль, хотя почитаю...
 

Gas

может по одной?
Проглядел что там or условие, а не and.
Calc_found_rows вполне штатная вещь в mysql, ну или вторым запросом select count(*) from (select count(film_id) as sessions ... твой запрос без сортировки и лимита) as t;
 

iNfantry

Новичок
Проглядел что там or условие, а не and.
Calc_found_rows вполне штатная вещь в mysql, ну или вторым запросом select count(*) from (select count(film_id) as sessions ... твой запрос без сортировки и лимита) as t;
Спасибо, про вложенный запрос я тоже думал, но наверное это не очень оптимально, напряжно для сервера. Вобщем я решил уже проблему по-другому, обошелся без HAVING (sessions_count мне по сути ненужен, достаточно проверять film_id IS NOT NULL, а выборку сделать не по id, а по DISTINCT(id), это если вкратце), тему можно закрыть. :)
 

Фанат

oncle terrible
Команда форума
вот интересно - почему каждый ламер, выбрав самое кривое решение из возможных, всегда считает своим долгом написать "тему можно закрывать"?
 

iNfantry

Новичок
Этот запрос не выглядит подходящим для "пагинации". Он возвращает все найденные строки, а не одну страницу.
В том запросе я просто убрал LIMIT 0,50, чтобы он не смущал людей.
А как ты вычислишь сколько страниц нужно отобразить, не зная общее количество записей, которое вернет запрос? Объясни мне и я признаю, что я ламер, ибо пока не знаю более подходящего решения.
Моё решение криво лишь тем, что требует два запроса для реализации механизма пагинации. Один запрос - общее количество записей, второй - порция записей для заданной страницы. Первый запрос необходим мне для того чтобы под записями вывести ссылки на все имеющиеся страницы.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Ну так вот в итоге ты добился обратного.
Поскольку для запроса, которому ты зачем-то сделал обрезание, никакого дополнительного запроса по очевидным причинам делать не нужно.

Возвращаясь же к теме, во-первых, можно попросить базу данных посчитать количество записей. И вернуть только количество
Это получится уже гораздо эффективнее, чем запрашивать их все, а в качестве побочного продукта получать количество. Это такой "бизнес по-русски" получается - "водку вылить, бутылки сдать, деньги пропить".

А во-вторых, в мускуле есть функция, специально предназначенная для твоего случая. См. http://www.phpfaq.ru/paginator#new
 

iNfantry

Новичок
Благодарю, каким-то образом я упустил такую возможность в мускле.
 
Сверху