0

サイトをプログラミングしていますが、このクエリを正しく取得できません。

チャンネルを含むテーブルがあります

select * from `channels` 

サイト内のすべてのページの閲覧に関する統計を含む別のテーブルがあります。

特定のチャネルへのすべての訪問を取得するには、次のように記述します

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

channelsここで、15 はテーブル内の行の ID と同じです。

作成する必要があるクエリはselect * from 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(集計)関数のページに移動します。これは、答えに対する強力なヒントです。

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

良い答えを得るには、テーブルに関する情報をさらに提供する必要があります。具体的には、チャネルのどの列が訪問のどの列と結合するかについての情報を明示的に提供していません。ただし、行間をいくらか読み取ると、GROUPBYを使用した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条件に移動することもできますが、オプティマイザはそれを自動的に行う必要があります。

カウントがゼロの場合でも、すべてのチャネルレコードを表示する場合は、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;
于 2012-04-23T00:39:19.147 に答える