我有这个数据库表
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/