2012-04-09 8 views
0

У меня есть таблица киоскеSQL запросы: выборка записей и проверка сумма в объединенной таблице

CREATE TABLE IF NOT EXISTS `kiosk` (
    `id` varchar(40) NOT NULL, 
    `netId` varchar(40) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `countryId` varchar(40) NOT NULL, 
    `cityId` varchar(40) NOT NULL, 
    `address` varchar(255) NOT NULL, 
    `lat` varchar(50) NOT NULL, 
    `long` varchar(50) NOT NULL, 
    `venue` varchar(255) NOT NULL, 
    `impressions` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

и настольного РАЗМЕЩЕНИЕ

CREATE TABLE IF NOT EXISTS `placement` (
    `id` varchar(40) NOT NULL, 
    `userId` varchar(40) NOT NULL, 
    `adId` varchar(40) NOT NULL, 
    `duration` int(11) NOT NULL, 
    `kioskId` varchar(40) NOT NULL, 
    `zoneId` varchar(40) NOT NULL, 
    `dateBegin` int(11) NOT NULL, 
    `dateEnd` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Размещение означает издательство объявления на киоске. Каждое место размещения имеет продолжительность и даты начала и окончания публикации. Разрешено составлять 240-секундный блок различных объявлений на одном киоске, этот блок будет поворачиваться снова и снова в течение дня.

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

Как я вижу, мне нужно выбрать киоски и суммировать длительности мест размещения, уже добавленных в эти киоски, чтобы проверить, могу ли я добавить запись места размещения в таблицу.

Я пытался что-то вроде

SELECT *, SUM(`placement`.`duration`) AS `d` 
FROM `kiosk` 
LEFT OUTER JOIN `placement` ON ((`cityId` = 'bac3d991-d13c-49c2-8563-8f974c75f6b9') 
AND (`placement`.`kioskId` = `kiosk`.`id`) 
AND ((`placement`.`dateBegin` BETWEEN 1333929600 AND 1333929600)) 
OR (`placement`.`dateEnd` BETWEEN 1333929600 AND 1333929600))) 
GROUP BY `kiosk`.`id` 
HAVING `d` <=225 
OR `d` IS NULL 

Здесь 225 количества возможных используемых секунд в блоке (я хочу, чтобы поместить 15 секунд объявления в этом примере), и если нет никакого размещения записей для этого киоска проверить d для будучи NULL

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

Я был бы благодарен за любую помощь

ответ

1

Изменить запрос на

SELECT *, SUM(`placement`.`duration`) AS `d` 
FROM `kiosk` 
LEFT OUTER JOIN `placement` ON (`kiosk`.`id` = `placement`.`kioskId`) 
WHERE ((`cityId` = 'bac3d991-d13c-49c2-8563-8f974c75f6b9') 
AND ((`placement`.`dateBegin` BETWEEN 1333929600 AND 1333929600)) 
OR (`placement`.`dateEnd` BETWEEN 1333929600 AND 1333929600))) 
GROUP BY `kiosk`.`id` 
HAVING `d` <=225 
OR `d` IS NULL 
+0

Это кажется ближе к тому, что мне нужно, но теперь это не retirns ни одной строки. Я думаю, это потому, что в таблице размещения нет соответствующих записей – necrobear

Смежные вопросы