栏目表CREATE TABLE `classes` (
  `class_id` int(11) NOT NULL auto_increment,
  `class_name` varchar(255) NOT NULL default '',
  `class_father` int(11) default NULL,
 
  PRIMARY KEY  (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8 COMMENT='栏目';通栏图片表
CREATE TABLE `leaderboard` (
  `id` int(11) NOT NULL auto_increment,
  `path` varchar(255) default NULL,
  `link_url` varchar(255) default NULL,
  `class_id` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `Leader_FK_classId` (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='?8';其中栏目表中class_father 存的是栏目的父亲ID,通栏图片表class_id 和栏目表的主键关联现在我要查的是根据一个栏目的ID得到他的所有子栏目的ID,名称  和 通栏图片表的所有属性。
select c.*,b.* from  Classes c  left join  Leaderboard b on c.class_father = b.class_id where c.class_father = 2  order by c.class_id;
我试过上面的这句SQL,有点问题,就是比如通栏图片表有相对应的3条记录,栏目表的记录也会显示3次,有没有办法只显示一次呢。或者还有其他更好的SQL写法,请高手指点一下!

解决方案 »

  1.   

    --感觉你的语句有点问题:“c.class_father = b.class_id”是不是应该改成"c.class_id = b.class_id"select c.*,b.* from  Classes c  left join  Leaderboard b on c.class_id = b.class_id where c.class_father = 2  order by c.class_id;--或者改成子查询的方式来查询,如下:select * from  Leaderboard a where class_id in (select class_id from Classes where class_father =2 and class_id = a.class_id);
      

  2.   

    根据一个栏目的ID得到他的所有子栏目的ID,名称  和 通栏图片表的所有属性。 通栏图片表的所有属性
    你既然要得要的这个那记录有多少条就会显示几条了
      

  3.   

    按照lz要求,根据一个ID获取所有子栏目ID,用一条sql是搞不定的,除非写存储过程去递归,但是mysql的递归受max_sp_recursion_depth的限制,所以不推荐使用mysql的递归一个好点办法是先按group_concat获取每个栏目的一级子栏目,然后用php去处理结果,这样可以找到每个ID的所有子栏目