我是堆栈溢出的新手,也是mysql的新手。我有4个以下4个表
第一张表是“圆形”表。
"Round" Table
+----+-------+-------+--------+
| ID | Round | order | Basket |
+----+-------+-------+--------+
| 1 | 159 | 1111 | 121 |
| 2 | 160 | 1112 | 61 |
| 3 | 161 | 1114 | 93 |
| 4 | 162 | 1113 | 25 |
| 5 | 161 | 1115 | 39 |
| 6 | 163 | 1118 | 61 |
| . | . | . | . |
| . | . | . | . |
| . | . | . | . |
+----+-------+-------+--------+
第二个表是“供应商”表,所有供应商名称都保存在其中。
"Supplier" Table
+----+---------+
| ID | Name |
+----+---------+
| 1 | Samsung |
| 2 | Nokia |
| 3 | LG |
| 4 | Xiaomi |
| 5 | Siemens |
| 6 | Bosch |
| . | . |
| . | . |
| . | . |
+----+---------+
第3个是“购物车”表
"Cart" Table
+-----+-------+--------------+
| ID | order | Suppliername |
+-----+-------+--------------+
| 365 | 1119 | Siemens |
| 366 | 1112 | Bitten |
| 367 | 1118 | Xiaomi |
| 368 | 1114 | Siemens |
| 369 | 1114 | Siemens |
| 370 | 1114 | Bosch |
| 371 | 1115 | Xiaomi |
| . | . | . |
+-----+-------+--------------+
第4个表是“Logistic”表和ID和顺序此表中的列来自“Cart”表但不是所有Cart.ID都在Logistic表中
"Logistic" Table
+--------+-------+--------+------+----------+
| CartID | order | packed | sent | splitted |
+--------+-------+--------+------+----------+
| 364 | 986 | 1 | 0 | 0 |
| 365 | 1119 | 0 | 0 | 1 |
| 366 | 1112 | 1 | 0 | 0 |
| 367 | 1118 | 1 | 0 | 0 |
| 368 | 1114 | 1 | 1 | 0 |
| 369 | 1114 | 0 | 0 | 1 |
| 370 | 1114 | 1 | 0 | 0 |
| 371 | 1115 | 0 | 0 | 0 |
| . | . | . | . | . |
| . | . | . | . | . |
| . | . | . | . | . |
+--------+-------+--------+------+----------+
我想得到/选择suppliername,count(Cart.ID),count(Logistic.packed),count(Logistic.sent)通过jut输入一些Rounds.Round来获得Rounds.Round = 161的结果应该看起来像什么像这样
+--------------+----------+--------+
| Suppliername | Expected | Packed |
+--------------+----------+--------+
| Xiaomi | 1 | 1 |
| Siemens | 2 | 1 |
| Bosch | 1 | 1 |
| . | . | . |
| . | . | . |
+--------------+----------+--------+
我已经编写了以下查询来获取供应商和预期数据,但其速度慢且取得> 20秒:
select l.Name,
(select Count(*)
from Cart e
where e.Suppliername = l.Name
AND e.order in (
SELECT p.order from Rounds p where p.Round = 161)
) as Expected
from Supplier l
有没有办法比这更快地提取数据?也许我需要使用索引,我应该在哪里使用索引?
答案 0 :(得分:0)
MySQL倾向于优化WHERE ... IN (SELECT ...)
,JOIN
通常效果更好。
SELECT l.name, IFNULL(e.count, 0) AS expected
FROM supplier AS l
LEFT JOIN (
SELECT c.suppliername, COUNT(*) count
FROM cart AS c
JOIN (SELECT DISTINCT order
FROM Rounds
WHERE Round = 161) AS r
ON c.order = r.order
GROUP BY c.suppliername
) AS e ON l.name = e.suppliername
您应该在supplier.name
,cart.suppliername
和cart.order
上拥有索引。 (cart.suppliername, cart.order)
上的综合索引可能是最好的。