0

我有一张桌子 KIOSK

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

似乎我做错了一切,因为我收到了所有信息亭的列表,不知道它的 cityId 或与之链接的展示位置。

我会感谢任何帮助

4

1 回答 1

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
于 2012-04-09T15:20:14.773 回答