我有3个表,总共约有20万行。
我的桌子:
warehouse_stock
id | barcode | quantity | warehouse_id
-------------------------------------------------
1 | 2211345661 | 21 | 1
2 | 2211345661 | 2 | 2
3 | 3452543234 | 1 | 2
4 | 3452543235 | 1 | 1
5 | 3452543236 | 1 | 1
6 | 3452543242 | 1 | 1
7 | 3452543245 | 1 | 1
8 | 3452543245 | 1 | 3
9 | 3452543245 | 1 | 1
product_variants
id | ean(barcode) | product_id
-------------------------------------
1 | 3452543245 | 14
2 | 3452543234 | 15
3 | 3452543245 | 16
4 | 3452543245 | 17
5 | 2211345661 | 18
6 | 2211345661 | 19
产品
id | name | color | manufacturer_id
------------------------------------------------
14 | Sample 1 | Red | 1
15 | Sample 2 | Black | 1
16 | Sample 3 | White | 1
17 | Sample 4 | White | 1
18 | Sample 5 | Orange | 2
19 | Sample 6 | Pink | 2
我只想展示SUM(quantity)
,product.name
,barcode
,manufacturer_id
和warehouse_id
。除了条形码编号之外没有任何关系。
这是我的代码:
SELECT
SUM(ws.quantity) AS total_q,
p.name,
ws.barcode,
p.manufacturer_id,
ws.warehouse_id
FROM warehouse_stock AS ws
INNER JOIN product_variants AS pv ON pv.ean = ws.barcode
INNER JOIN products AS p ON p.id = pv.product_id
WHERE ws.warehouse_id = 1 AND p.manufacturer_id = 1
GROUP BY ws.barcode
它有效,但主要是因为该查询已关闭。然后我们必须重新启动它。
如何更改此选项以使用子查询?
PS:sql上没有索引。没有索引权限。所以,我想要你的建议。对于这样的查询,子查询可能比JOIN更好。
答案 0 :(得分:0)
如果您只是在warehouse_stock.warehouse_id
和product_variants.ean
上添加索引,则应该没有重写查询以使用子查询。由于将使用索引,查询将运行得更快。如果查询使用子查询,则会更慢。
此外,由于您GROUP BY
仅ws.barcode
,因此行包含来自多个products
的信息,因此p.name
仅显示第一个产品名称组。每行不代表特定产品的计数,但是可能涵盖多个barcode
的特定products
的计数,因此p.name
可能会在行中产生误导。