簡體   English   中英

如何使用此查詢優化性能?

[英]how can i optimize performance with this query?

我有三個表,用戶,活動和購買。

用戶有許多活動和購買,活動有4種類型。

我需要這樣查詢用戶:

[
    {
        user_id: 1,

        // from activities
        post_count: 2,
        updated_count: 3,
        print_count: 4,
        share_count: 5,

        // from purchases
        purchase_count: 6
    },
    ...
]

我用這個SQL:

SELECT u.id, post.post_count, updated.update_count, print.print_count, share.share_count, purchase.purchase_count

FROM users as u

LEFT JOIN (
  SELECT user_id, activity_type, count(*) as post_count 
  FROM activities 
  WHERE activity_type = 1
  GROUP BY user_id
  ) post

ON u.id = post.user_id

LEFT JOIN (
  SELECT user_id, activity_type, count(*) as update_count
  FROM activities 
  WHERE activity_type = 2
  GROUP BY user_id
  ) updated

ON u.id = updated.user_id

LEFT JOIN (
  SELECT user_id, activity_type, count(*) as print_count 
  FROM activities 
  WHERE activity_type = 3
  GROUP BY user_id
  ) print

ON u.id = print.user_id

LEFT JOIN (
  SELECT user_id, activity_type, count(*) as share_count 
  FROM activities 
  WHERE activity_type = 4
  GROUP BY user_id
  ) share

ON u.id = share.user_id


LEFT JOIN (
  SELECT user_id, count(*) AS purchase_count 
  FROM purchases 
  GROUP BY user_id
  ) purchase

ON u.id = purchase.user_id

如何使用此查詢優化性能?


非常感謝Eugen Rieck

我對此修改了他的查詢,然后成功了。

SELECT
  users.id AS user_id,
  SUM(IF((activities.activity_type=1),1,0)) AS post_count,
  SUM(IF((activities.activity_type=2),1,0)) AS update_count,
  SUM(IF((activities.activity_type=3),1,0)) AS print_count,
  SUM(IF((activities.activity_type=4),1,0)) AS share_count,
  IFNULL(purchase.count,0) AS purchase_count
FROM
  users
  LEFT JOIN activities ON activities.user_id=users.id
  LEFT JOIN (
    SELECT user_id, count(*) AS count 
    FROM purchases 
    GROUP BY user_id
  ) purchase
  ON users.id = purchase.user_id
GROUP BY users.id

當前,您運行活動表4次-可以折疊為一個:

SELECT
  users.id AS user_id,
  SUM(IF(activites.activity_type=1,1,0)) AS post_count,
  SUM(IF(activites.activity_type=2,1,0)) AS update_count,
  SUM(IF(activites.activity_type=3,1,0)) AS print_count,
  SUM(IF(activites.activity_type=4,1,0)) AS share_count,
  IFNULL(COUNT(purchases.id),0) AS purchase_count
FROM
  users
  INNER JOIN activities ON activities.user_id=users.id
  LEFT JOIN purchases ON purchases.user_id=users.id
GROUP BY users.id

暫無
暫無

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

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