Трудности в составлении запроса [как учесть то, где нет записей?]

iSlayter

Новичок
Трудности в составлении запроса [как учесть то, где нет записей?]

Задача: необходимо реализовать интернет-версию обычного рекламного журнала. страница состоит из 2х колонок и 5 рядов. Сложность в том, что на каждой странице разное количество рекламных объявлений (одно объявление может занимать как всю страницу целиком, так и какие-то определенные ячейки, таким образом мы не можем посчитать кол-во страниц в журнале. Нумерация страниц обязательно должна быть такой же, как и в бумажной версии.
Дамп таблицы:
CREATE TABLE `pr_main` (
`id` int(10) NOT NULL auto_increment,
`cid` int(2) NOT NULL default '0',
`title` varchar(255) NOT NULL default '',
`url` varchar(255) NOT NULL default '',
`x` int(1) NOT NULL default '0',
`y` int(1) NOT NULL default '0',
`unique` varchar(255) NOT NULL default '',
`date` date NOT NULL default '0000-00-00',
`clicks` int(6) NOT NULL default '0',
`pagenum` int(2) NOT NULL default '0',
`img_path` varchar(255) NOT NULL default '',
`fullpage` int(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

INSERT INTO `pr_main` VALUES (1, 1, 'Тест', 'http://islayter.com/', 1, 1, '', '2007-07-06', 2, 1, '2007-07/first.jpg', 1);
INSERT INTO `pr_main` VALUES (2, 2, 'Test', 'http://ya.ru/', 2, 1, '', '2007-07-10', 1, 1, '2007-07/Untitled-5.jpg', 0);
INSERT INTO `pr_main` VALUES (3, 2, 'Test', 'http://ya.ru/', 1, 1, '', '2007-07-10', 1, 2, '2007-07/Untitled-5.jpg', 0);
Я решил отвести поле `pagenum` для хранения страницы, которой принадлежит данный баннер.
По нему подсчитываю кол-во страниц следующим образом:
SQL запрос #1:
SELECT COUNT(DISTINCT `pagenum`) AS `count` FROM `pr_main` WHERE `date` LIKE "2007-07%" AND `cid` < 2
В этом запросе мы получили кол-во страниц до этой рубрики, за июль этого года.
SQL запрос #2:
SELECT MAX(`pagenum`) as `max` FROM `pr_main` WHERE `date` LIKE "2007-07%" AND `cid` = 2
В этом запросе мы получили кол-во страниц в этой рубрике.


Таким образом теперь у нас есть все данные для построения панельки постраничной навигации.
К примеру в первой рубрике у меня есть одна страница, со второй по пятую рубрики не хранится ничего, но зато в шестой есть один баннер и нам нужно показать номер этой страницы. С моим запросом #1 я не учитываю того, что даже если в рубрике нет ни одной записи на неё отводится одна страница. И перейдя в шестую рубрику номер страницы будет не 7 (т.к. в первой рубрике 2 страницы), а 3, т.к. не учитывается то, что в рубрике со второй по шестую не смотря на то, что нет записей, но должна быть как-минимум одна страница.

Единственный вариант, который приходит мне на ум: создать пустые записи с номером страницы 1, датой этого месяца и всеми рубриками. Делать это придётся каждый раз. Я считаю, что это неправильно. Т.к. из-за этого лишняя логика в панели администратора появляется. При добавлении первого за месяц баннера в какую-либо рубрику придётся редактировать уже существующую запись. Конечно же, если никто не предложит решения так и поступлю, но этого бы крайне не хотелось, т.к. на мой взгляд это неверно. Буду рад выслушать любые мнения, спасибо за внимание :)

-~{}~ 11.07.07 15:32:

более того ... блин
SELECT COUNT(DISTINCT `pagenum`) AS `count` FROM `pr_main` WHERE `date` LIKE "2007-07%" AND `cid` < 13
этот запрос подсчитывает количество полей pagenum с уникальными записями не учитывая условия where. теперь никак и не подсчитаешь количество страниц до... к этому я готов не был.

какие-нибудь предложения?
 

partizan

Новичок
объясни проблему покороче, тогда мож кто-нить че и подскажет.
Тебе самому не влом было бы читать столько текста и вникать, чтоб помочь незнакомому человеку?
 

iSlayter

Новичок
Как посчитать кол-во записей, в которых поле pagenum принимает различные значения, но при это надо учесть, что поле date должно быть LIKE 2007-07% и поле cid<13

?
 

asm

Пофигист
SELECT COUNT(*) FROM (SELECT ... WHERE ... LIKE 2007-07% и поле cid<13 ... GROUP BY pagenum)
 

Wicked

Новичок
я так понял основная задача - сделать сквозную нумерацию страниц по всем рубрикам, причем:
1) некоторые категории могут не иметь баннеров вообще, но на них нужно отводить страницу
2) некоторые категории могут иметь более одной стриницы

так?
 

iSlayter

Новичок
К сожалению не верно запрос срабатывает.
Дамп:
INSERT INTO `pr_main` VALUES (1, 1, 'Тест', 'http://islayter.com/', 1, 1, '', '2007-07-06', 2, 1, '2007-07/first.jpg', 1);
INSERT INTO `pr_main` VALUES (2, 2, 'Test', 'http://ya.ru/', 2, 1, '', '2007-07-10', 1, 1, '2007-07/Untitled-5.jpg', 0);
INSERT INTO `pr_main` VALUES (3, 2, 'Test', 'http://ya.ru/', 1, 1, '', '2007-07-10', 1, 2, '2007-07/Untitled-5.jpg', 0);
INSERT INTO `pr_main` VALUES (4, 3, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (5, 4, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (6, 5, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (7, 6, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (8, 7, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (9, 8, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (10, 9, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (11, 10, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (12, 11, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (13, 12, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (14, 13, '', '', 0, 0, '', '2007-07-00', 0, 1, '', 0);
INSERT INTO `pr_main` VALUES (15, 2, 'Test', 'http://ya.ru/', 2, 2, '', '2007-07-10', 1, 2, '2007-07/Untitled-5.jpg', 0);
результат запроса
SELECT COUNT( * )
FROM (

SELECT *
FROM `pr_main`
WHERE `date` LIKE '2007-07%'
AND `cid` <13
GROUP BY `pagenum`
) AS `count`
LIMIT 0 , 30
выдаёт 2

-~{}~ 11.07.07 17:20:

Автор оригинала: Wicked
я так понял основная задача - сделать сквозную нумерацию страниц по всем рубрикам, причем:
1) некоторые категории могут не иметь баннеров вообще, но на них нужно отводить страницу
2) некоторые категории могут иметь более одной стриницы

так?
абсолютно верно!
 

Wicked

Новичок
select count(distinct `cid`, `pagenum`) from `pr_main` where `date` LIKE '2007-07%' and `cid` < 13;
выдает 13
 

iSlayter

Новичок
Огромное, невероятное, мегочеловеческое спасибо! :)

мануал конечно в этом деле себя великолепно показал!
хоть бы один пример привели.
http://dev.mysql.com/doc/refman/5.1/en/counting-rows.html
 
Сверху