Mysql

相關表中復雜和計數的優化

  • October 2, 2015

我有一個categories表,它有兩列,id並且name.

我有一個types表,它有三列idcategory_idpoints

我有一個products表,它有三列idtype_idcustomer_id

這意味著每個產品都有一個類型,每個類型都有一個類別。一個品類有很多類型,一種類型有很多產品。

我正在使用 MySQL 和 PHP。

從 PHP 中,給定 a customer_id,我想知道客戶在每個類別中分別有多少分(例如,向使用者顯示一個表格)。

我的解決方案:我會首先進行查詢以查找所有類別 id,然後對於每個類別,category_id我會找到該類別中的所有類型(即所有具有給定 的類型category_id);然後對於每個type_id我會計算有多少產品同時具有那個type_id和給定的customer_id,我會乘以那個數量為給定的點type_id。將每個結果的所有結果相加type_id,我最終得到了給定客戶的總分category_id。正如我所說,我必須為每個category_id. **我的解決方案會起作用,但在我看來它會非常慢。我正在尋找有關如何以更好的方式解決此問題的建議 - 使用更少的查詢或更快的查詢,或兩者兼而有之。**按照現在的方式,它可以執行與類別數量一樣多的查詢。


例子:

/* TABLE: categories */

name           id
A              1
B              2
C              3

/* TABLE: types */

points         id          category_id
1000             1                1
500              2                1
200              3                3
50               4                2
20               5                3
1                6                3

/* TABLE: products */

id           type_id          customer_id
1               2                   13
2               4                   13
3               5                   13
4               6                   13
5               5                   13
6               3                   13
7               4                   13
8               5                   13
9               6                   13

如果給定的 customer_id 是 13,我想得到如下內容:

A 類總分 500 分 B 類總分 100 分 C 類總分 262 分

1. 在不改變我的數據庫結構的情況下,有什麼好的方法可以做到這一點?

2. 有沒有一種好方法可以改變我的數據庫設計以允許更好的方法來做到這一點?(當然,為了簡單起見,我在表格中省略了其他欄位)。

您的問題表明您正在以程序方式思考,但是您需要以“基於集合”的方式思考。

以下查詢可以幫助您更好地理解這一點:

SELECT p.customer_id
   , c.name
   , sum(t.points)
FROM products p
   INNER JOIN types t ON p.type_id = t.id
   INNER JOIN categories c ON t.category_id = c.id
GROUP BY p.customer_id
   , c.name;

本質上,這應該向您顯示 customer_id、類別名稱以及每個客戶在每個類別中的總分的列表。它通過使用聚合函式 ( SUM) 和GROUP BY子句來實現這一點。

(請在此處查看我的答案以獲取有關命名ID列的資訊)

引用自:https://dba.stackexchange.com/questions/116753