我有这个数据库表

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');

还有一个表,我保存用户id,类别id。
用户id 1000可以看到1和5,我把这些信息放在会话中,这样我的查询就变成
SELECT *
FROM `category`
WHERE id
IN ( 1, 5 )

此查询显示Fruits > Apples-所有这些都工作正常。但是,我已经将“Green Apples”标记为“Inherit = 'Yes'”,因此用户1000也应该看到“Green Apples”,而不是“Red Apples”。如果绿苹果下有子类别标记为inherit='Y'。。。例如,“一打青苹果”也应该列出来!!
我想给工会一个机会,但我不知道如何让两个层次更深。。。
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 categ是遗传的,那么getCategory(1)的结果应该是Fruits,Apples,Green Apples

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

10-13 04:26