我正在嘗試優化一個函式(MySQL),但JOIN仍然沒有完全理解(我嘗試做一個簡單的例子):
我有 2 張桌子:
餐桌用品
| ID | ID_ORDER | ID_BOX | 名稱 |
|---|---|---|---|
| 001 | 2564 | 123 | 勺子_1 |
| 002 | 2564 | 123 | 勺子_2 |
| 006 | 2564 | 123 | 鞋_2 |
| 007 | 2564 | 123 | 鞋_1 |
| 003 | 2565 | 124 | 勺子_1 |
| 004 | 2565 | 124 | 勺子_2 |
| 008 | 2565 | 124 | 鞋_1 |
| 009 | 2565 | 124 | 鞋_2 |
| 005 | 2565 | 125 | 勺子_1 |
| 010 | 2565 | 125 | 鞋_1 |
物件的描述通過 ID_ORDER 和 NAME 鏈接到 ITEM 表。(在同一個合同中不可能有 2 個同名的專案)。
表描述:
| ID_ORDER | 名稱 | 長度 | 寬度 | .... |
|---|---|---|---|---|
| 2564 | 勺子_1 | 200 | 20 ... | |
| 2564 | 勺子_2 | 300 | 20 ... | |
| 2564 | 鞋_1 | 500 | 20 ... | |
| 2564 | 鞋_2 | 600 | 20 ... |
現在,我需要知道合同中的所有專案及其描述,我使用以下查詢:
SELECT * FROM items INNER JOIN description
ON (description.ID_ORDER=items.ID_ORDER AND description.NAME=items.NAME)
WHERE ID_ORDER= 2564
問題是,SQL 如何處理這樣的句子?
例如在前面的 SPOON_2 示例中,該陳述句可能回傳 2 條記錄:
| ID | ID_ORDER | ID_BOX | 名稱 | 長度 | 寬度 | ..... |
|---|---|---|---|---|---|---|
| 002 | 2564 | 123 | 勺子_2 | 300 | 20 | ... |
| 004 | 2564 | 123 | 勺子_2 | 300 | 20 | ... |
SQL 有什么行為?我認為第一個(正如我所理解的 INNER JOIN),我想有第二個行為(也許是 RIGHT JOIN,但不確定)。
它在合約中創建了 2 個專案“SPOON_2”,然后為每個專案尋找其描述
它創建了 2 個專案,但是當它識別它們是相同的描述(相同的 ID_ORDER AND NAME)時,它只會讀取一次描述,然后將其應用于 2 個專案。
uj5u.com熱心網友回復:
您可以使用 EXPLAIN 命令,它會讓您知道 MySQL 計劃如何回答您的查詢。您可以使用它來優化查詢以使其運行得更快,或者只是為了了解它的作業原理。見https://dev.mysql.com/doc/refman/8.0/en/explain.html
例如:
EXPLAIN SELECT * FROM items INNER JOIN description
ON (description.ID_ORDER=items.ID_ORDER AND description.NAME=items.NAME)
WHERE ID_ORDER=2564
uj5u.com熱心網友回復:
在您的示例中,您的行不會重復,因為列的值ID不同002 , 004
如果您需要減少資料集的結果,那么您必須只選擇您真正需要的列并應用不同的子句
select DISTINCT ID_ORDER, ID_BOX , NAME, LENGTH, WIDTH
FROM items
INNER JOIN description ON description.ID_CONTRACT=items.ID_CONTRACT
AND description.NAME=items.NAME
WHERE ID_CONTRACT= 2564
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/384919.html
