SQL查询:选择记录并检查连接表中的总和

时间:2012-04-09 15:17:10

标签: sql join

我有一张桌子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;

和表PLACEMENT

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或与之相关的展示位置。

我会感谢任何帮助

1 个答案:

答案 0 :(得分: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