我对网站进行了编程,但我无法正确查询。
我有一个包含频道的表
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));
答案 0 :(得分:1)
既然你提到你不熟悉SQL连接,也许你会发现主题上的Wikipedia article或W3Schools 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;