0

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

我有一个包含频道的表

select * from `channels` 

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

为了获得对特定频道的所有访问,我会写

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

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

我需要编写的查询应该使用带有 sum 的连接select * from channels并添加一个额外的单元格(值)来获取 Channels 中每个 id 的访问次数。


从评论到答案:

名为 Channels 的表包含列 id 和 name。名为 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));
4

2 回答 2

1

既然您提到您不熟悉 SQL 联接,也许您会发现有关该主题的Wikipedia 文章W3Schools 课程信息丰富(这些是我在 Google 搜索“SQL 联接”时的前 2 个结果)。

如果做不到这一点,请按照SUM()MySQL函数参考中的链接将一个人带到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;
于 2012-04-23T00:37:25.597 回答
0

您需要提供有关表格的更多信息才能获得好的答案。具体来说,您没有明确提供有关 Channels 中的哪些列与 Visits 中的哪些列连接的信息。但是,在字里行间有一些阅读,使用 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),其中xLog 表中的相应列是:

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;
于 2012-04-23T00:39:19.147 回答