2016-01-20 55 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; –

相关问题