2012-04-23 8 views
0

我編程一個網站,我無法得到正確的查詢。使用加入和

我有一個包含渠道

select * from `channels` 

一個表,我有包含在該網站查看每個頁面的統計另一個表。

要到特定的頻道的所有訪問,我會寫

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

其中15等於在channels表中的行的ID。

我需要編寫的查詢應該使用總和爲select * from 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

我不理解聯接查詢,因爲我試圖做一個記錄訪問的訪問名稱的單元格,但它不是準確性,日誌表更精確 – 2012-04-23 00:31:20

回答

0

您需要提供一些關於表格的更多信息才能得到很好的答案。具體而言,您尚未明確提供有關「渠道」中的哪些列與訪問中的哪些列加入的信息。然而,與線之間的一些閱讀,與GROUP BY連接查詢應該做的工作:

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狀態,但優化程序自動爲您做到這一點。

如果你想看到所有頻道的記錄,甚至那些零個計數,您必須使用LEFT OUTER JOIN(簡稱LEFT JOIN)和COUNT(x),其中x是在日誌表中相應的列:

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; 
+0

該表的表頻道包含ID,名稱 和日誌表包含IP,模塊,中間 模塊=頻道 mid =頻道。編號 每個通道ID可以通過查詢獲得其所有訪問 SELECT SUM(ip)AS訪問FROM'log'其中'module' ='channels'和mid ='15' – 2012-04-23 00:41:38

+0

@MoustafaAbdulKareem:更新問題以包含模式的兩個表。而且,請在將來自動執行。當關鍵信息丟失時(特別是表名,相關列,主鍵和外鍵信息),很難回答問題。 – 2012-04-23 00:42:59

+0

哇,它的工作完美,因爲我想,非常感謝 – 2012-04-23 00:53:02

1

既然你提到,你是不熟悉SQL連接,也許你會發現Wikipedia article或主題信息的W3Schools lesson(這些是前2結果時,我搜索谷歌的「SQL連接」)。

如果失敗,在MySQL function reference中關於SUM()的鏈接需要一頁到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;