mysql - 选择查询具有父子关系的类别数据

标签 mysql sql select tree

我有这个数据库表

CREATE TABLE IF NOT EXISTS `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `name` varchar(100) NOT NULL,
  `inherit` enum('Y','N') NOT NULL DEFAULT 'N',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;

--
-- Dumping data for table `category`
--

INSERT INTO `category` (`id`, `parent_id`, `name`, `inherit`) VALUES
(1, 0, 'Fruits', 'N'),
(2, 0, 'Electronics', 'N'),
(3, 0, 'Furniture', 'N'),
(4, 0, 'Garden', 'N'),
(5, 1, 'Apples', 'N'),
(6, 1, 'Bananas', 'N'),
(7, 5, 'Green Apples', 'Y'),
(8, 5, 'Red Apples', 'N'),
(9, 2, 'Mobiles', 'Y'),
(10, 2, 'Televisions', 'N'),
(11, 9, 'Android', 'N'),
(12, 9, 'iPhone', 'Y'),
(13, 7, 'One Dozen Green Apples', 'Y'),
(14, 7, 'Two Dozens Green Apples', 'N');

还有另一个表,我保存 user_id、category_id 例如 user_id 1000 可以看到 1 和 5,我把这些信息放在 session 中,这样我的查询就变成了

SELECT *
FROM `category`
WHERE id
IN ( 1, 5 )

此查询显示Fruits > Apples - 所有这些都工作正常。但是,我已将“青苹果”标记为Inherit = 'Yes',因此用户 1000 也应该看到“青苹果”,但看不到“红苹果”。如果青苹果下有子类别标记为继承 = 'Y'...例如“一打青苹果”也应该列出!!

我想尝试一下 UNION,但不知道如何深入 2 级以上......

SELECT * FROM (
    SELECT *
    FROM `category`
    WHERE id
    IN ( 1, 5 )

    UNION

    SELECT c.*
    FROM `category` c
    INNER JOIN `category` parent ON parent.id = c.id AND c.inherit = 'Y'
    WHERE c.parent_id
    IN ( 1, 5 )
) all_cats

你会给我什么建议?我正在开放表结构更改,这是否会使查询变得更容易?谢谢

最佳答案

尝试自加入:

编辑:我忘记添加 WHERE 子句

SELECT
    a.name,
    b.name,
    c.name
FROM 
    category as a
LEFT JOIN category as b
    ON b.parent_id = a.id
INNER JOIN category as c
    ON c.parent_id = b.id
    AND c.inherit = 'Y'
WHERE
    a.id = 1

但理想的解决方案是使用一个递归函数来执行此操作,因为在该表中您正在描述类别树。上面的查询是静态的,它返回 2 个级别(2 个子类别),据我了解,您需要一些动态的内容。

类似于下面的函数:

public String getCategory(int categId){

    String sSql = "SELECT name FROM category WHERE id = " + categId ;
    String name = oDb.exec(sql).get("name");

    sSql = "SELECT id FROM category WHERE inherit = 'Y' AND parent_id = " + categId ;
    int nextCategId = oDb.exec(sql).get("id");

    if(nextCategId != null){
        return name + "," + getCategory(nextCategId);
    }else{
        return name;
    }

}

因此,假设继承了 Apples 类别,则 getCategory(1) 的结果应为 Fruits,Apples,Green Apples

关于mysql - 选择查询具有父子关系的类别数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16146401/

相关文章:

mysql - 如何查询表中最新的记录

javascript - 运行 AJAX 代码时,行总和不会更新,直到 F5 刷新

php - Cs购物车产品查询很慢

mysql - 极其缓慢的嵌套 mySQL 查询

SQL:在内部使用过滤器查看或在选择时使用过滤器查看

sql - 查询每个部门最近雇佣的员工

c - AF_UNIX 套接字 : select() firing when there is nothing to read

html - Mobile Safari 多选错误

c# - 从 mysql 检索的日期数据不是 c# 中标签上显示的确切数据

sql - 如何从 Oracle 检索下 n 个未锁定的行?