0

私は3つのmysqlデータベーステーブルを持っています

 1) websites
+-----+--------------------+
|  id |website             |
+-----+--------------------+
|   1 | http://abcd.com    |
|   2 | http://xyz.com     |
|   3 | http://pqrs.com    | 
+-----+--------------------+

 2) pages
+-----+---------------------------------------+
|  id |page                                   |
+-----+---------------------------------------+
|   1 | http://abcd.com/index.php             |
|   2 | http://abcd.com/contact.php           |
|   3 | http://xyz.com /index.php             | 
|   4 | http://pqrs.com /index.php            |
+-----+---------------------------------------+

 3) statistics
+-----+-------------------+
|  id |page_id | type     |
+-----+-------------------+
|   1 | 1      | AOL      |
|   2 | 1      | YAHOO    |
|   3 | 2      | AOL      | 
|   4 | 3      | YAHOO    |
|   5 | 3      | YAHOO    |
|   6 | 4      | YAHOO    |
+-----+-------------------+

OUTPUTを次のようにします:

+-------------------+--------------------+
|website            | count_hit_by_AOL   | 
+-------------------+--------------------+
|http://abcd.com    |      2             |
|http://xyz.com     |      0             |
|http://pqrs.com    |      0             |
+-------------------+--------------------+

この出力を取得するために、次のmysqlクエリを使用しています--

SELECT
  COUNT(statistics.id) as count_stats,
  websites.website
FROM websites,
  pages,
  statistics
WHERE pages.page LIKE CONCAT(websites.website,'%')
    AND pages.id = statistics.page_id
    and statistics.type LIKE 'AOL%'
GROUP BY websites.website
ORDER BY count_stats DESC

そして、私は次のように出力を得ています

+-------------------+--------------------+
|website            | count_hit_by_AOL   | 
+-------------------+--------------------+
|http://abcd.com    |      2             |
+-------------------+--------------------+

私はMYSQLが初めてなので、何か間違っていることがあれば助けてください。

4

1 に答える 1

3

既存のクエリの問題はINNER JOIN、テーブルで を使用しているため、一致する行のみが返されることです。

websiteすべての行を返したいので、次を使用する必要がありLEFT JOINます。

SELECT w.website, count(s.id) Total
FROM websites w
LEFT JOIN pages p
  on p.page like CONCAT(w.website,'%')
LEFT JOIN statistics  s
  on p.id = s.page_id
  and s.type like 'AOL%'
group by w.website

SQL Fiddle with Demoを参照してください。結果は次のとおりです。

|         WEBSITE | TOTAL |
---------------------------
| http://abcd.com |     2 |
| http://pqrs.com |     0 |
|  http://xyz.com |     0 |

編集#1、Webサイトごとの合計ページ数を含めたい場合は、次を使用できます。

SELECT w.website, 
  count(s.id) TotalStats,
  count(p.page) TotalPages
FROM websites w
LEFT JOIN pages p
  on p.page like  CONCAT (w.website,'%')
LEFT JOIN statistics  s
  on p.id = s.page_id
  and s.type like 'AOL%'
group by w.website

SQL Fiddle with Demoを参照してください。このクエリの結果は次のとおりです。

|         WEBSITE | TOTALSTATS | TOTALPAGES |
---------------------------------------------
| http://abcd.com |          2 |          2 |
| http://pqrs.com |          0 |          1 |
|  http://xyz.com |          0 |          1 |
于 2013-03-13T12:11:37.967 に答える