[英]How to formulate the query to join more than one table
我的表格如下
users id name 1 Michael 2 James 3 John 4 Susie 5 Harvey products pid name uploader post_id views exclude groupid 1 learn_java 2 1 21 0 1 2 learn_sql 1 2 8 0 2 3 4 GB DDR3 0 3 5 0 3 4 love jacket 2 4 0 0 5 5 1 TB HDD 3 5 12 1 4 6 kill_ants 3 6 5 0 6 7 2 TB HDD 2 7 2 0 4 8 8 GB DDR3 2 8 18 0 3 9 1 GB DDR2 3 9 7 0 3 product_group gid name category 1 text 1 2 pdf 1 3 ram 2 4 hdd 2 5 leather 0 6 diy 0 product_category cid name 1 book 2 electronics /* forgot about comment field*/ comments comment_id post_id comment 1 1 ... 2 1 ... 3 2 ... 4 2 ... 5 2 ... 6 3 ...
我的目標:
產品表有4種類型的數據。
沒有上傳器的產品(上傳者= 0)
正在審核的產品(不包括= 1)
屬於category = 0的產品(poducts.groupid = product_group.gid AND product_group.category = 0)
由上傳者上傳的產品,不在審核范圍內且不屬於category = 0(uploader!= 0,exclude = 1,poducts.groupid = product_group.gid AND product_group.category!= 0)
我只需要考慮第四類數據。 我必須排除前三種類型的數據。 我必須通過他們的上傳器對這些數據進行分組。 說,詹姆斯已經上傳了3個產品,瓊斯已經上傳了2個產品,其余的用戶還沒有上傳任何東西。
查詢應該返回此信息
3 James SUM對3個產品的看法2 Jones SUM對2個產品的看法0 user1 0 0 user2 0 .... ....
因此,如果我考慮我的表的數據,我想按照以下順序獲取數據
product_num users.id users.name total_views 3 2 James 41(21+18+2) 1 3 Jones 7 1 1 Michael 8 0 5 Harvey 0/NULL 0 4 Susie 0/NULL
我想出了這個。
SELECT COUNT(pid) as product_num,
SUM(views) as total_views
users.*
FROM users
INNER JOIN products ON products.uploader = users.id
INNER JOIN product_group ON products.groupid = product_group.category
WHERE exclude = 0
AND product_group.category != 0
這顯然不起作用,因為它不包括尚未上傳任何產品的用戶。 如何使這項工作考慮到這些用戶?
編輯:
SELECT COUNT(pid) as product_num,
SUM(views) as total_views
users.*
FROM users
LEFT JOIN products ON products.uploader = users.id
INNER JOIN product_group ON products.groupid = product_group.category
WHERE exclude = 0
AND product_group.category != 0
GROUP BY users.id
ORDER BY product_num
它也不會使用戶上傳0。
第二次編輯:
我添加了一個評論表(我之前忘記了)。 有沒有辦法顯示用戶的total_number注釋。
在這里,詹姆斯已經上傳了產品1,4,8。對於這些post_id也是1,4,8(實際上這些將不一樣)。 從評論表中,這些帖子有以下評論數量2,0,0。因此,評論總數2。
所以,最終的結果應該是
product_num users.id users.name total_views total_comments 3 2 James 41(21+18+2) 2 1 3 Jones 7 0/NULL 1 1 Michael 8 3 0 5 Harvey 0/NULL 0/NULL 0 4 Susie 0/NULL 0/NULL
試試這個查詢:
SELECT COUNT(pid) as product_num,
SUM(views) as total_views,
u.*
FROM users u
LEFT JOIN products p
ON p.uploader = u.id
LEFT JOIN product_group pg
ON p.groupid = pg.gid
WHERE p.exclude = 0
AND p.uploader <> 0
AND pg.category != 0
OR p.pid is null
GROUP BY u.id
演示: http : //sqlfiddle.com/#!2 / c94bef/12
要計算多個注釋,請在SELECT子句中添加一個從屬子查詢:
SELECT count(*)
FROM comments c
WHERE c.post_id = p.post_id
通過這種方式:
SELECT COUNT(pid) as product_num,
SUM(views) as total_views,
( SELECT count(*)
FROM comments c
WHERE c.post_id = p.post_id
) As total_comments,
u.*
FROM users u
LEFT JOIN products p
ON p.uploader = u.id
LEFT JOIN product_group pg
ON p.groupid = pg.gid
WHERE p.exclude = 0
AND p.uploader <> 0
AND pg.category != 0
OR p.pid is null
GROUP BY u.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.