2016-01-20 52 views
0

我有以下SQL語句:MySQL的,在同一查詢中設置一個結果值到另一個值

SELECT `entity_id`,`parent_id`,`name` 
    FROM category 
    WHERE is_active = 1 
    ODER BY parent_id asc, position asc; 

它返回類似下面的結果:

+-----------+-----------+------------+----------+ 
| id  | parent_id | Name  | desc  | 
+-----------+-----------+------------+----------+ 
| 1   | NULL  | Fruit  | NULL  | 
+-----------+-----------+------------+----------+ 
| 2   | 1   | Apple  | NULL  | 
+-----------+-----------+------------+----------+ 

我想更新查詢,以便在父ID字段中返回相應的名稱。所以,我的輸出會是這樣:

+-----------+-----------+------------+----------+ 
| id  | parent_id | Name  | desc  | 
+-----------+-----------+------------+----------+ 
| 1   | NULL  | Fruit  | NULL  | 
+-----------+-----------+------------+----------+ 
| 2   | Fruit  | Apple  | NULL  | 
+-----------+-----------+------------+----------+ 

我一直在使用同一個表內連接玩這個查詢了一段時間,雖然我不知道這是正確的做法。任何人都可以推薦一種方法。

回答

1

這必須是這個,你在尋找:

SELECT c.`entity_id`,c. p.`name` as parent_id, c.`name` 
    FROM category c 
    LEFT JOIN category p WHERE c.`parent_id = p.id 
    WHERE c.is_active = 1 
    ORDER BY c.parent_id ASC, c.position ASC; 
+0

內的子查詢有一個錯誤在查詢'ODER' –

+0

@Jonathan ParentLévesque - 謝謝 –

+0

不幸的是,我在正確加入之後在WHERE發生錯誤。 –

1

貝恩德Buffen答案是正確的,另一種方式來做到這一點會使用主查詢

SELECT c.`entity_id`, IFNULL((SELECT c2.`name` FROM category c2 WHERE c.`entity_id` = c2.`parent_id`), '') as parent_name, c.`name` 
FROM category c 
WHERE c.is_active = 1 
ORDER BY c.parent_id asc, c.position asc; 
+0

謝謝你,不幸的是,這並不適用於所有領域。 I.E.大多數parent.id字段留空,即使ID存在名稱。 –

+0

你確定所有的父母身份真的存在嗎?你確定所有的行都有名字的值嗎?如果父表id在你的表中很重要,你應該考慮添加一個外鍵和一個索引。它將提高讀取數據時的性能(寫入時會稍微減少一點),並在刪除父ID時確保數據完整性。 'ALTER TABLE category ADD KEY ak_parent_id(parent_id) ADD CONSTRAINT fk_parent_id FOREIGN KEY(parent_id)REFERENCES類別(entity_id)ON DELETE SET NULL; –

相關問題