0

何らかの理由で、SELECT クエリがすべての行の重複を返しています。これが私のテーブルの簡単な内訳です​​:

製品: products_id | master_categories_id | 製品モデル | 製品ステータス | products_quantity
カテゴリ:カテゴリ ID | 親 ID
カテゴリの説明:カテゴリ ID | カテゴリ名

このクエリは問題なく動作します...

***QUERY***
SELECT
  categories_name AS category,
  products_model AS model,
  products_status AS status,
  products_quantity AS qty
FROM products p
LEFT JOIN categories c
ON c.categories_id = p.master_categories_id
LEFT JOIN categories_description cd
USING (categories_id)
WHERE p.products_quantity > 0
AND p.products_status = FALSE;


***OUTPUT***
+-------------+------------------------+--------+-----+
| category    | model                  | status | qty |
+-------------+------------------------+--------+-----+
| Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Batteries   | BATT-LHP203            |      0 |   1 |
| Batteries   | BATT-LIB201            |      0 |   1 |
| Refurbished | UC*DELL-OPT-760-DC-IBC |      0 |   9 |
| Desktop     | HDD-320-SATA-3.5-PULL  |      0 |  12 |
| Refurbished | UL*ASUS-S56CM-SH51     |      0 |   1 |
+-------------+------------------------+--------+-----+

ただし、カテゴリ テーブルには、上記のカテゴリの親カテゴリを示す parent_id が含まれています (例: Cables > Network)。これは、上記のマスターカテゴリの名前を含めようとする私の試みです:

***QUERY***
SELECT
  parent_name AS parent,
  categories_name AS category,
  products_model AS model,
  products_status AS status,
  products_quantity AS qty
FROM products p
LEFT JOIN categories c
ON c.categories_id = p.master_categories_id
LEFT JOIN categories_description cd
USING (categories_id)
LEFT JOIN (
  SELECT
    parent_id,
    categories_name AS parent_name
  FROM categories c
  LEFT JOIN categories_description cd
  ON cd.categories_id = c.parent_id
) par
USING (parent_id)
WHERE p.products_quantity > 0
AND p.products_status = FALSE;

***OUTPUT***
+--------------+-------------+------------------------+--------+-----+
| parent       | category    | model                  | status | qty |
+--------------+-------------+------------------------+--------+-----+
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-10-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Cables       | Network     | CP-C-03-CAT6X0         |      0 |   5 |
| Laptop Parts | Batteries   | BATT-LHP203            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LHP203            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LHP203            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LHP203            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LIB201            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LIB201            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LIB201            |      0 |   1 |
| Laptop Parts | Batteries   | BATT-LIB201            |      0 |   1 |
| Desktop PCs  | Refurbished | UC*DELL-OPT-760-DC-IBC |      0 |   9 |
| Desktop PCs  | Refurbished | UC*DELL-OPT-760-DC-IBC |      0 |   9 |
| Hard Drives  | Desktop     | HDD-320-SATA-3.5-PULL  |      0 |  12 |
| Hard Drives  | Desktop     | HDD-320-SATA-3.5-PULL  |      0 |  12 |
| Hard Drives  | Desktop     | HDD-320-SATA-3.5-PULL  |      0 |  12 |
| Hard Drives  | Desktop     | HDD-320-SATA-3.5-PULL  |      0 |  12 |
| Laptops      | Refurbished | UL*ASUS-S56CM-SH51     |      0 |   1 |
| Laptops      | Refurbished | UL*ASUS-S56CM-SH51     |      0 |   1 |
+--------------+-------------+------------------------+--------+-----+

ご覧のとおり、各行は複数回複製されています。私は何を間違っていますか?

4

2 に答える 2

1

を使用select distinctするのは悪い習慣です。必要な場合もありますが、この場合は必要ありません。クエリを修正するのは簡単なのに、重複を削除するという余分な作業を行うのはなぜですか?

句は次のfromようになります。

FROM products p left join
     categories c
     ON c.categories_id = p.master_categories_id left join
     categories_description cd
     USING (categories_id) left join
     categories_description cdp
     on cdp.categories_id = c.parent_id

追加のサブクエリは、追加の処理オーバーヘッドを導入するだけでなく、重複や不要なクエリの複雑化ももたらします。

于 2013-06-03T23:26:19.633 に答える
0

DISTINCT を使用して重複を削除する

DISTINCT を選択 ...

于 2013-06-03T22:51:46.707 に答える