簡體   English   中英

如何制定查詢以加入多個表

[英]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種類型的數據。

  1. 沒有上傳器的產品(上傳者= 0)

  2. 正在審核的產品(不包括= 1)

  3. 屬於category = 0的產品(poducts.groupid = product_group.gid AND product_group.category = 0)

  4. 由上傳者上傳的產品,不在審核范圍內且不屬於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

演示: http//sqlfiddle.com/#!2/5c44f/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM