我有这个数据库表与父子关系类别数据
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');
select查询还有一个表,其中我一直USER_ID,例如CATEGORY_ID USER_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'... “一打青苹果”也应该列出来!
我想给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
,你会建议我什么?如果可以更轻松地查询,我是否打开了表格结构更改?感谢
是的,我明白你的意思。其实,上面的1&5是通过这样的功能选择的。例如,User_Category表只有5个,但我通过上面的类似函数选择它的父项1。我只是想知道如果我可以用查询来实现...如果没有,我需要再次检查该函数,看看如何获得继承= Y的 – user1421214 2013-04-22 12:21:52
你不能通过查询实现这一点,由于简单的事实,你不从一开始就知道一个类别有多少个子级别......但是如果你存储了这个信息(categ_id |子级别的数量),你可以动态地生成一个类似于上面的查询(联接数目=子级别数目) – Stephan 2013-04-22 12:28:21
yes是正确的我不知道在一开始的水平...但是,我可以修改脚本,以保持水平.... – user1421214 2013-04-22 12:30:17