使用sum加入

时间:2012-04-23 00:22:30

标签: php mysql

我对网站进行了编程,但我无法正确查询。

我有一个包含频道的表

select * from `channels` 

我有另一张表,其中包含查看网站中每个页面的统计信息。

要获得特定频道的所有访问,我会写

SELECT SUM(ip) AS visits FROM `log` where `module` = 'channels' and mid = '15'

其中15等于channels表中行的id。

我需要编写的查询应使用加为select * from channels的联接,并添加一个额外的单元格(值)以获取渠道中每个ID的访问次数。


从评论到答案:

  

名为Channels的表包含列id和名称。名为Log的表包含ip,module,mid列。 log.module = 'channel'; log.mid = channel.id。每个渠道ID(例如“15”)都可以通过查询SELECT SUM(ip) AS visits FROM log where module = 'channels' and mid = '15'获取所有访问次数。

大致是:

CREATE TABLE Channels (ID INTEGER, Name CHAR(30), PRIMARY KEY ID);
CREATE TABLE Log (IP CHAR(16), Module CHAR(10), MID INTEGER REFERENCES Channels(ID));

2 个答案:

答案 0 :(得分:1)

既然你提到你不熟悉SQL连接,也许你会发现主题上的Wikipedia articleW3Schools lesson提供信息(当我搜索Google时,这些是前2个结果) SQL join“)。

如果不这样做,请点击MySQL function reference中关于SUM()的链接,将{1}转到GROUP BY (Aggregate) functions页面,这是对答案的强烈暗示。

SELECT channels.*, SUM(ip) AS visits
FROM
  channels JOIN log ON (
    log.module = 'channels' AND
    log.mid = channels.id -- or whatever is the appropriate column in `channels`
  )
GROUP BY log.mid;

答案 1 :(得分:0)

您需要提供有关表格的更多信息才能得到一个好的答案。具体来说,您没有明确提供有关“频道”中哪些列与“访问”中的哪些列相关联的信息。但是,如果在行之间进行一些读取,则使用GROUP BY的JOIN查询应该完成以下任务:

SELECT c.id, COUNT(*) AS Visits
  FROM Channels AS C
  JOIN Log      AS L ON c.id = l.mid
 WHERE l.module = 'channels'
 GROUP BY c.id;

您也可以将WHERE子句移动到ON条件,但优化器应该自动为您执行此操作。

如果要查看所有Channel记录,即使是那些计数为零的记录,也必须使用LEFT OUTER JOIN(缩写为LEFT JOIN)和COUNT(x),其中x是Log表中的适当列:

SELECT c.id, COUNT(l.mid) AS Visits
  FROM Channels AS C
  LEFT JOIN Log AS L ON c.id = l.mid
 WHERE l.module = 'channels'
 GROUP BY c.id;