discuz论坛 两个表forums,threads 已知fid,要获得其下属论坛中的最新帖子

用户昵称不能为空 2009-12-19 12:37:40
discuz论坛的获取最新帖子以及该帖子所属论坛的名字。


已知条件fid,涉及表cdb_forums,cdb_threads,要获得的东西,该论坛论坛ID为fid的,加父论坛的ID为fid,或者父父论坛的ID为fid的里面的所有的帖子中的最新的 帖子列表,我写了几个都不行啊。

示例:已知fid=86

我用的SQL语句如下:

SELECT t.*,f.*
FROM cdb_threads t
LEFT JOIN cdb_forums f ON t.fid=f.fid
LEFT JOIN cdb_forums gf ON gf.fid=t.fid AND gf.type='group'
LEFT JOIN cdb_forums ff ON ff.fid=t.fid AND ff.type='forum'
LEFT JOIN cdb_forums sf ON sf.fid=t.fid AND sf.type='sub'
WHERE ((sf.fid='86' OR ff.fid='86') OR gf.fid='86')
ORDER BY t.lastpost DESC
LIMIT 0 , 24 ;




表的设计:
mysql> desc cdb_threads;
+-----------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------------+------+-----+---------+----------------+
| tid | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| fid | smallint(6) unsigned | NO | MUL | 0 | |
| iconid | smallint(6) unsigned | NO | | 0 | |
| typeid | smallint(6) unsigned | NO | | 0 | |
| sortid | smallint(6) unsigned | NO | MUL | 0 | |
| readperm | tinyint(3) unsigned | NO | | 0 | |
| price | smallint(6) | NO | | 0 | |
| author | char(15) | NO | | | |
| authorid | mediumint(8) unsigned | NO | MUL | 0 |
| subject | char(80) | NO | | | |
| dateline | int(10) unsigned | NO | | 0 | |
| lastpost | int(10) unsigned | NO | | 0 | |
| lastposter | char(15) | NO | | | |
| views | int(10) unsigned | NO | | 0 | |
| replies | mediumint(8) unsigned | NO | | 0 | |
| displayorder | tinyint(1) | NO | | 0 | |
| highlight | tinyint(1) | NO | | 0 | |
| digest | tinyint(1) | NO | MUL | 0 | |
| rate | tinyint(1) | NO | | 0 | |
| special | tinyint(1) | NO | | 0 | |
| attachment | tinyint(1) | NO | | 0 | |
| moderated | tinyint(1) | NO | | 0 | |
| closed | mediumint(8) unsigned | NO | | 0 | |
| itemid | mediumint(8) unsigned | NO | | 0 | |
| supe_pushstatus | tinyint(1) | NO | | 0 | |
| recommends | smallint(6) | NO | MUL | | |
| recommend_add | smallint(6) | NO | | | |
| recommend_sub | smallint(6) | NO | | | |
| heats | int(10) unsigned | NO | MUL | 0 | |
+-----------------+-----------------------+------+-----+---------+----------------+
29 rows in set (0.03 sec)




mysql> desc cdb_forums;
+------------------+-----------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-----------------------------+------+-----+---------+----------------+
| fid | smallint(6) unsigned | NO | PRI | NULL | auto_increment |
| fup | smallint(6) unsigned | NO | MUL | 0 | |
| type | enum('group','forum','sub') | NO | | forum | |
| name | char(50) | NO | | | |
| status | tinyint(1) | NO | MUL | 0 | |
| displayorder | smallint(6) | NO | | 0 | |
| styleid | smallint(6) unsigned | NO | | 0 | |
| threads | mediumint(8) unsigned | NO | | 0 | |
| posts | mediumint(8) unsigned | NO | | 0 | |
| todayposts | mediumint(8) unsigned | NO | | 0 | |
| lastpost | char(110) | NO | | | |
| allowsmilies | tinyint(1) | NO | | 0 | |
| allowhtml | tinyint(1) | NO | | 0 | |
| allowbbcode | tinyint(1) | NO | | 0 | |
| allowimgcode | tinyint(1) | NO | | 0 | |
| allowmediacode | tinyint(1) | NO | | 0 | |
| allowanonymous | tinyint(1) | NO | | 0 | |
| allowshare | tinyint(1) | NO | | 0 | |
| allowpostspecial | smallint(6) unsigned | NO | | 0 | |
| allowspecialonly | tinyint(1) unsigned | NO | | 0 | |
| alloweditrules | tinyint(1) | NO | | 0 | |
| allowfeed | tinyint(1) | NO | | 1 | |
| recyclebin | tinyint(1) | NO | | 0 | |
| modnewposts | tinyint(1) | NO | | 0 | |
| jammer | tinyint(1) | NO | | 0 | |
| disablewatermark | tinyint(1) | NO | | 0 | |
| inheritedmod | tinyint(1) | NO | | 0 | |
| autoclose | smallint(6) | NO | | 0 | |
| forumcolumns | tinyint(3) unsigned | NO | | 0 | |
| threadcaches | tinyint(1) | NO | | 0 | |
| alloweditpost | tinyint(1) unsigned | NO | | 1 | |
| simple | tinyint(1) unsigned | NO | | | |
| modworks | tinyint(1) unsigned | NO | | | |
| allowtag | tinyint(1) | NO | | 1 | |
| allowglobalstick | tinyint(1) | NO | | 1 | |
+------------------+-----------------------------+------+-----+---------+----------------+
35 rows in set (0.03 sec)


forum中的类型有三种,(表forum中的字段type)
1.group -- 大论坛
2.forum -- 论坛
3.sub -- 子论坛。

===============================================================================================
如何才可以选出,只已知一个fid,
...全文
437 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
能不能把你的表简化一下?仅保留必要的字段?

然后举例说明一下?


建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
[Quote]我上面写的那个是错误的。现在用程序弄。[/Quote]换成是我,也和程序来解决。也就三步,利用 group_concat 得到这么个字符串,"1,2,3" ,然后生成查询语句 select * from cdb_threads where fid in (1,2,3) 这样,还可以利用上索引。效率比较高。
  • 打赏
  • 举报
回复
我上面写的那个是错误的。现在用程序弄。
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 acmain_chm 的回复:]
不过这种功能,不如直接在你的代码中实现。 下面是一种方法

SQL codemysql>set@x='1';
Query OK,0 rows affected (0.00 sec)

mysql>select@x:=concat(@x,',',group_concat(fid))->from cdb_forums->where find_in_set(fup,@x);+--------------------------------------+|@x:=concat(@x,',',group_concat(fid))|+--------------------------------------+|1,2|+--------------------------------------+1 rowinset (0.00 sec)

mysql>select@x:=concat(@x,',',group_concat(fid))->from cdb_forums->where find_in_set(fup,@x);+--------------------------------------+|@x:=concat(@x,',',group_concat(fid))|+--------------------------------------+|1,2,2,3|+--------------------------------------+1 rowinset (0.00 sec)

mysql>
mysql>select*from cdb_threads->where find_in_set(fid,@x)->orderby datelinedesc;+-----+-----+----------+--------------------------+------------+| tid| fid| authorid| subject| dateline|+-----+-----+----------+--------------------------+------------+|31|3|0| 直接放在三级论坛下的帖子|1261184576||21|2|0| 直接放在二级论坛下的帖子|1261184553||11|1|0| 直接放在大论坛下的帖子|1261184536|+-----+-----+----------+--------------------------+------------+3 rowsinset (0.00 sec)

mysql>


SQL codemysql>set@x='2';
Query OK,0 rows affected (0.00 sec)

mysql>select@x:=concat(@x,',',group_concat(fid))->from cdb_forums->where find_in_set(fup,@x);+--------------------------------------+|@x:=concat(@x,',',group_concat(fid))|+--------------------------------------+|2,3|+--------------------------------------+1 rowinset (0.02 sec)

mysql>select@x:=concat(@x,',',group_concat(fid))->from cdb_forums->where find_in_set(fup,@x);+--------------------------------------+|@x:=concat(@x,',',group_concat(fid))|+--------------------------------------+|2,3,3|+--------------------------------------+1 rowinset (0.00 sec)

mysql>
mysql>select*from cdb_threads->where find_in_set(fid,@x)->orderby datelinedesc;+-----+-----+----------+--------------------------+------------+| tid| fid| authorid| subject| dateline|+-----+-----+----------+--------------------------+------------+|31|3|0| 直接放在三级论坛下的帖子|1261184576||21|2|0| 直接放在二级论坛下的帖子|1261184553|+-----+-----+----------+--------------------------+------------+2 rowsinset (0.00 sec)

mysql>
[/Quote]
你的这个太复杂了。
我终于试出了一个了,测试暂时没有问题的。


SELECT t. * , f. *
FROM cdb_threads t
LEFT JOIN cdb_forums f ON f.fid = t.fid
LEFT JOIN cdb_forums gf ON gf.fid = f.fup
LEFT JOIN cdb_forums sf ON sf.fup = f.fid
WHERE f.fup =3
OR f.fid =3
LIMIT 0 , 30
ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
不过这种功能,不如直接在你的代码中实现。 下面是一种方法

mysql> set @x='1';
Query OK, 0 rows affected (0.00 sec)

mysql> select @x:=concat(@x,',',group_concat(fid))
-> from cdb_forums
-> where find_in_set(fup,@x);
+--------------------------------------+
| @x:=concat(@x,',',group_concat(fid)) |
+--------------------------------------+
| 1,2 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> select @x:=concat(@x,',',group_concat(fid))
-> from cdb_forums
-> where find_in_set(fup,@x);
+--------------------------------------+
| @x:=concat(@x,',',group_concat(fid)) |
+--------------------------------------+
| 1,2,2,3 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> select * from cdb_threads
-> where find_in_set(fid,@x)
-> order by dateline desc;
+-----+-----+----------+--------------------------+------------+
| tid | fid | authorid | subject | dateline |
+-----+-----+----------+--------------------------+------------+
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 |
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 |
| 11 | 1 | 0 | 直接放在大论坛下的帖子 | 1261184536 |
+-----+-----+----------+--------------------------+------------+
3 rows in set (0.00 sec)

mysql>



mysql> set @x='2';
Query OK, 0 rows affected (0.00 sec)

mysql> select @x:=concat(@x,',',group_concat(fid))
-> from cdb_forums
-> where find_in_set(fup,@x);
+--------------------------------------+
| @x:=concat(@x,',',group_concat(fid)) |
+--------------------------------------+
| 2,3 |
+--------------------------------------+
1 row in set (0.02 sec)

mysql> select @x:=concat(@x,',',group_concat(fid))
-> from cdb_forums
-> where find_in_set(fup,@x);
+--------------------------------------+
| @x:=concat(@x,',',group_concat(fid)) |
+--------------------------------------+
| 2,3,3 |
+--------------------------------------+
1 row in set (0.00 sec)

mysql>
mysql> select * from cdb_threads
-> where find_in_set(fid,@x)
-> order by dateline desc;
+-----+-----+----------+--------------------------+------------+
| tid | fid | authorid | subject | dateline |
+-----+-----+----------+--------------------------+------------+
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 |
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 |
+-----+-----+----------+--------------------------+------------+
2 rows in set (0.00 sec)

mysql>
ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
mysql> set @x=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select *
-> from cdb_threads
-> where fid=@x
-> or fid in (select fid from cdb_forums where fup=@x)
-> or fid in (select t2.fid from cdb_forums t1 inner join cdb_forums t2 on t1.fid=t2.fup where t1.fup=@x);
+-----+-----+----------+--------------------------+------------+
| tid | fid | authorid | subject | dateline |
+-----+-----+----------+--------------------------+------------+
| 11 | 1 | 0 | 直接放在大论坛下的帖子 | 1261184536 |
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 |
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 |
+-----+-----+----------+--------------------------+------------+
3 rows in set (0.00 sec)

mysql> set @x=2;
Query OK, 0 rows affected (0.00 sec)

mysql> select *
-> from cdb_threads
-> where fid=@x
-> or fid in (select fid from cdb_forums where fup=@x)
-> or fid in (select t2.fid from cdb_forums t1 inner join cdb_forums t2 on t1.fid=t2.fup where t1.fup=@x);
+-----+-----+----------+--------------------------+------------+
| tid | fid | authorid | subject | dateline |
+-----+-----+----------+--------------------------+------------+
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 |
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 |
+-----+-----+----------+--------------------------+------------+
2 rows in set (0.00 sec)

mysql> set @x=3;
Query OK, 0 rows affected (0.00 sec)

mysql> select *
-> from cdb_threads
-> where fid=@x
-> or fid in (select fid from cdb_forums where fup=@x)
-> or fid in (select t2.fid from cdb_forums t1 inner join cdb_forums t2 on t1.fid=t2.fup where t1.fup=@x);
+-----+-----+----------+--------------------------+------------+
| tid | fid | authorid | subject | dateline |
+-----+-----+----------+--------------------------+------------+
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 |
+-----+-----+----------+--------------------------+------------+
1 row in set (0.00 sec)

mysql>
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 acmain_chm 的回复:]
引用
forum中的类型有三种,(表forum中的字段type)
1.group  -- 大论坛
2.forum  -- 论坛
3.sub -- 子论坛。也就是说最多三层?
[/Quote]

恩,是的,最多三层,forum字段type 类型

 | type             | enum('group','forum','sub') | NO   |     | forum   |         |

ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
[Quote]
forum中的类型有三种,(表forum中的字段type)
1.group -- 大论坛
2.forum -- 论坛
3.sub -- 子论坛。[/Quote]也就是说最多三层?
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 acmain_chm 的回复:]
+-----+-----+-------+----------+
| fid | fup | type  | name    |
+-----+-----+-------+----------+
|  1 |  0 | group | 大论坛  |
|  2 |  0 | forum | 论坛    |
|  3 |  0 | sub  | 下属论坛 |
+-----+-----+-------+----------+

相互隶属关系在哪里体现?
[/Quote]


不好意思,我第一次写的时候写错了,他们的关系是如下的:

mysql> select * from cdb_forums;
+-----+-----+-------+----------+
| fid | fup | type | name |
+-----+-----+-------+----------+
| 1 | 0 | group | 大论坛 |
| 2 | 1 | forum | 论坛 |
| 3 | 2 | sub | 下属论坛 |
+-----+-----+-------+----------+
3 rows in set (0.00 sec)

ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
+-----+-----+-------+----------+
| fid | fup | type | name |
+-----+-----+-------+----------+
| 1 | 0 | group | 大论坛 |
| 2 | 0 | forum | 论坛 |
| 3 | 0 | sub | 下属论坛 |
+-----+-----+-------+----------+

相互隶属关系在哪里体现?
  • 打赏
  • 举报
回复
很抱歉啊,数据错了,论坛cdb_forums里面的数据有错的。
是这个数据:
fid=2的fup=1不是=0
fid=3的fup=2不是等于0




mysql> select * from cdb_forums;
+-----+-----+-------+----------+
| fid | fup | type | name |
+-----+-----+-------+----------+
| 1 | 0 | group | 大论坛 |
| 2 | 1 | forum | 论坛 |
| 3 | 2 | sub | 下属论坛 |
+-----+-----+-------+----------+
3 rows in set (0.00 sec)
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 acmain_chm 的回复:]
SQL codemysql>select*from cdb_forums;+-----+-----+-------+----------+| fid| fup| type| name|+-----+-----+-------+----------+|1|0|group| 大论坛||2|0| forum| 论坛||3|0| sub| 下属论坛|+-----+-----+-------+----------+3 rowsinset (0.00 sec)

mysql>select*from cdb_threads;+-----+-----+----------+--------------------------+------------+| tid| fid| authorid| subject| dateline|+-----+-----+----------+--------------------------+------------+|11|1|0| 直接放在大论坛下的帖子|1261184536||21|2|0| 直接放在二级论坛下的帖子|1261184553||31|3|0| 直接放在三级论坛下的帖子|1261184576|+-----+-----+----------+--------------------------+------------+3 rowsinset (0.00 sec)

mysql>

期望的结果是什么?
[/Quote]


当fid=1的时候

+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
| tid | fid | authorid | subject | dateline | fid | fup | type | name |
+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
| 11 | 1 | 0 | 直接放在大论坛下的帖子 | 1261184536 | 1 | 0 | group | 大论坛 |
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 | 2 | 0 | forum | 论坛 |
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 | 3 | 0 | sub | 下属论坛 |
+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
3 rows in set (0.00 sec)





当fid=2的时候

+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
| tid | fid | authorid | subject | dateline | fid | fup | type | name |
+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 | 2 | 0 | forum | 论坛 |
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 | 3 | 0 | sub | 下属论坛 |
+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
3 rows in set (0.00 sec)


当fid=3的时候

+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
| tid | fid | authorid | subject | dateline | fid | fup | type | name |
+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 | 3 | 0 | sub | 下属论坛 |
+-----+-----+----------+--------------------------+------------+------+------+-------+----------+
3 rows in set (0.00 sec)

  • 打赏
  • 举报
回复


(
SELECT t.*,f.*
FROM cdb_threads t
LEFT JOIN cdb_forums f ON t.fid=f.fid AND f.type='group'
LEFT JOIN cdb_forums ff ON ff.fup=f.fid AND ff.type='forum'
LEFT JOIN cdb_forums sf ON sf.fup=ff.fid AND sf.type='sub'
WHERE f.fid=2
)
UNION ALL
(
SELECT t.*,f.*
FROM cdb_threads t
LEFT JOIN cdb_forums f ON t.fid=f.fid AND f.type='forum'
LEFT JOIN cdb_forums sf ON sf.fup=f.fid AND sf.type='sub'
WHERE f.fid=2
)
UNION ALL
(
SELECT t.*,f.*
FROM cdb_threads t
LEFT JOIN cdb_forums f ON t.fid=f.fid AND f.type='sub'
WHERE f.fid=2
)
ORDER BY tid DESC
LIMIT 0,24;


用了新的语句还是不行。
ACMAIN_CHM 2009-12-19
  • 打赏
  • 举报
回复
mysql> select * from cdb_forums;
+-----+-----+-------+----------+
| fid | fup | type | name |
+-----+-----+-------+----------+
| 1 | 0 | group | 大论坛 |
| 2 | 0 | forum | 论坛 |
| 3 | 0 | sub | 下属论坛 |
+-----+-----+-------+----------+
3 rows in set (0.00 sec)

mysql> select * from cdb_threads;
+-----+-----+----------+--------------------------+------------+
| tid | fid | authorid | subject | dateline |
+-----+-----+----------+--------------------------+------------+
| 11 | 1 | 0 | 直接放在大论坛下的帖子 | 1261184536 |
| 21 | 2 | 0 | 直接放在二级论坛下的帖子 | 1261184553 |
| 31 | 3 | 0 | 直接放在三级论坛下的帖子 | 1261184576 |
+-----+-----+----------+--------------------------+------------+
3 rows in set (0.00 sec)

mysql>


期望的结果是什么?
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]
能不能把你的表简化一下?仅保留必要的字段?

然后举例说明一下?


建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
  参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

  1. 你的 create table xxx .. 语句
  2. 你的 insert into xxx ... 语句
  3. 结果是什么样,(并给以简单的算法描述)
  4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

  这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。


[/Quote]

不好意思,我现在简化下表:

-- --------------------------------------------------------

--
-- 表的结构 `cdb_forums`
--

CREATE TABLE `cdb_forums` (
`fid` smallint(6) unsigned NOT NULL auto_increment,
`fup` smallint(6) unsigned NOT NULL default '0',
`type` enum('group','forum','sub') NOT NULL default 'forum',
`name` char(50) NOT NULL default '',
PRIMARY KEY (`fid`),
KEY `forum` (`type`),
KEY `fup` (`fup`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- 导出表中的数据 `cdb_forums`
--

INSERT INTO `cdb_forums` VALUES (1, 0, 'group', '大论坛');
INSERT INTO `cdb_forums` VALUES (2, 0, 'forum', '论坛');
INSERT INTO `cdb_forums` VALUES (3, 0, 'sub', '下属论坛');



--
-- 表的结构 `cdb_threads`
--

CREATE TABLE `cdb_threads` (
`tid` mediumint(8) unsigned NOT NULL auto_increment,
`fid` smallint(6) unsigned NOT NULL default '0',
`authorid` mediumint(8) unsigned NOT NULL default '0',
`subject` char(80) NOT NULL default '',
`dateline` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`tid`),
KEY `displayorder` (`fid`),
KEY `authorid` (`authorid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=32 ;

--
-- 导出表中的数据 `cdb_threads`
--

INSERT INTO `cdb_threads` VALUES (11, 1, 0, '直接放在大论坛下的帖子', 1261184536);
INSERT INTO `cdb_threads` VALUES (21, 2, 0, '直接放在二级论坛下的帖子', 1261184553);
INSERT INTO `cdb_threads` VALUES (31, 3, 0, '直接放在三级论坛下的帖子', 1261184576);


  • 打赏
  • 举报
回复

--
-- 数据库: `discuz_full`
--

--
-- 导出表中的数据 `cdb_forums`
--

INSERT INTO `cdb_forums` VALUES (1, 0, 'group', '大论坛', 0, 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1);
INSERT INTO `cdb_forums` VALUES (2, 0, 'forum', '二级论坛', 0, 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1);
INSERT INTO `cdb_forums` VALUES (3, 0, 'sub', '三级论坛', 0, 0, 0, 0, 0, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1);

--
-- 导出表中的数据 `cdb_threads`
--

INSERT INTO `cdb_threads` VALUES (11, 1, 0, 0, 0, 0, 0, '', 0, '直接放在大论坛下的帖子', 1261184536, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
INSERT INTO `cdb_threads` VALUES (21, 2, 0, 0, 0, 0, 0, '', 0, '直接放在二级论坛下的帖子', 1261184553, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
INSERT INTO `cdb_threads` VALUES (31, 3, 0, 0, 0, 0, 0, '', 0, '直接放在三级论坛下的帖子', 1261184576, 0, '', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);







mysql> select fid,type,name from cdb_forums;
+-----+-------+----------+
| fid | type | name |
+-----+-------+----------+
| 1 | group | 大论坛 |
| 2 | forum | 论坛 |
| 3 | sub | 下属论坛 |
+-----+-------+----------+
3 rows in set (0.02 sec)


mysql> select tid,fid,subject ,dateline from cdb_threads;
+-----+-----+--------------------------+------------+
| tid | fid | subject | dateline |
+-----+-----+--------------------------+------------+
| 11 | 1 | 直接放在大论坛下的帖子 | 1261184536 |
| 21 | 2 | 直接放在二级论坛下的帖子 | 1261184553 |
| 31 | 3 | 直接放在三级论坛下的帖子 | 1261184576 |
+-----+-----+--------------------------+------------+
3 rows in set (0.00 sec)


以上数据中:

当fid为1的时候,显示 11,21,31这三个帖子,因为fid=1的论坛是大论坛,即type='group',(因为tid=11的fid=1,tid=21的论坛的上一级论坛的fid=2,tid=31的论坛的上一级论坛的上一级论坛的fid=1,

当fid为2的时候,显示21,31这两个帖子,因为fid=2的时候的论坛是二级论坛,即type='forum',(因为tid=21的fid=2,tid=31的论坛的上一级论坛的fid=2)

当fid为3的时候,只显示3这个帖子,因为fid=3的时候是三级论坛,即type='sub',(因为tid=31的论坛的fid=3)


  • 打赏
  • 举报
回复
[Quote=引用 1 楼 acmain_chm 的回复:]
能不能把你的表简化一下?仅保留必要的字段?

然后举例说明一下?


建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
  参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

  1. 你的 create table xxx .. 语句
  2. 你的 insert into xxx ... 语句
  3. 结果是什么样,(并给以简单的算法描述)
  4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

  这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。


[/Quote]

数据库类型mysql。

我用的SQL语句如下:
(
SELECT t . * , f . *
FROM cdb_threads t
LEFT JOIN cdb_forums f ON t.fid = f.fid
AND f.type = 'group'
LEFT JOIN cdb_forums ff ON ff.fup = f.fid
AND ff.type = 'forum'
LEFT JOIN cdb_forums sf ON sf.fup = ff.fid
AND sf.type = 'sub'
WHERE (
f.fid = '1'
OR (
ff.fid = '1'
OR sf.fid = '1'
)
)
)
UNION ALL (

SELECT t . * , f . *
FROM cdb_threads t
LEFT JOIN cdb_forums f ON f.fid = t.fid
AND f.type = 'forum'
LEFT JOIN cdb_forums sf ON sf.fup = f.fid
AND sf.type = 'sub'
WHERE (
f.fid = '1'
OR sf.fid = '1'
)
)
UNION ALL (

SELECT t . * , f . *
FROM cdb_threads t
LEFT JOIN cdb_forums f ON f.fid = t.fid
AND f.type = 'sub'
WHERE f.fid = '1'
)
ORDER BY tid DESC
LIMIT 0 , 24;



--
-- 数据库: `discuz_full`
--

-- --------------------------------------------------------

--
-- 表的结构 `cdb_forums`
--

CREATE TABLE `cdb_forums` (
`fid` smallint(6) unsigned NOT NULL auto_increment,
`fup` smallint(6) unsigned NOT NULL default '0',
`type` enum('group','forum','sub') NOT NULL default 'forum',
`name` char(50) NOT NULL default '',
`status` tinyint(1) NOT NULL default '0',
`displayorder` smallint(6) NOT NULL default '0',
`styleid` smallint(6) unsigned NOT NULL default '0',
`threads` mediumint(8) unsigned NOT NULL default '0',
`posts` mediumint(8) unsigned NOT NULL default '0',
`todayposts` mediumint(8) unsigned NOT NULL default '0',
`lastpost` char(110) NOT NULL default '',
`allowsmilies` tinyint(1) NOT NULL default '0',
`allowhtml` tinyint(1) NOT NULL default '0',
`allowbbcode` tinyint(1) NOT NULL default '0',
`allowimgcode` tinyint(1) NOT NULL default '0',
`allowmediacode` tinyint(1) NOT NULL default '0',
`allowanonymous` tinyint(1) NOT NULL default '0',
`allowshare` tinyint(1) NOT NULL default '0',
`allowpostspecial` smallint(6) unsigned NOT NULL default '0',
`allowspecialonly` tinyint(1) unsigned NOT NULL default '0',
`alloweditrules` tinyint(1) NOT NULL default '0',
`allowfeed` tinyint(1) NOT NULL default '1',
`recyclebin` tinyint(1) NOT NULL default '0',
`modnewposts` tinyint(1) NOT NULL default '0',
`jammer` tinyint(1) NOT NULL default '0',
`disablewatermark` tinyint(1) NOT NULL default '0',
`inheritedmod` tinyint(1) NOT NULL default '0',
`autoclose` smallint(6) NOT NULL default '0',
`forumcolumns` tinyint(3) unsigned NOT NULL default '0',
`threadcaches` tinyint(1) NOT NULL default '0',
`alloweditpost` tinyint(1) unsigned NOT NULL default '1',
`simple` tinyint(1) unsigned NOT NULL,
`modworks` tinyint(1) unsigned NOT NULL,
`allowtag` tinyint(1) NOT NULL default '1',
`allowglobalstick` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`fid`),
KEY `forum` (`status`,`type`,`displayorder`),
KEY `fup` (`fup`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;

-- --------------------------------------------------------

--
-- 表的结构 `cdb_threads`
--

CREATE TABLE `cdb_threads` (
`tid` mediumint(8) unsigned NOT NULL auto_increment,
`fid` smallint(6) unsigned NOT NULL default '0',
`iconid` smallint(6) unsigned NOT NULL default '0',
`typeid` smallint(6) unsigned NOT NULL default '0',
`sortid` smallint(6) unsigned NOT NULL default '0',
`readperm` tinyint(3) unsigned NOT NULL default '0',
`price` smallint(6) NOT NULL default '0',
`author` char(15) NOT NULL default '',
`authorid` mediumint(8) unsigned NOT NULL default '0',
`subject` char(80) NOT NULL default '',
`dateline` int(10) unsigned NOT NULL default '0',
`lastpost` int(10) unsigned NOT NULL default '0',
`lastposter` char(15) NOT NULL default '',
`views` int(10) unsigned NOT NULL default '0',
`replies` mediumint(8) unsigned NOT NULL default '0',
`displayorder` tinyint(1) NOT NULL default '0',
`highlight` tinyint(1) NOT NULL default '0',
`digest` tinyint(1) NOT NULL default '0',
`rate` tinyint(1) NOT NULL default '0',
`special` tinyint(1) NOT NULL default '0',
`attachment` tinyint(1) NOT NULL default '0',
`moderated` tinyint(1) NOT NULL default '0',
`closed` mediumint(8) unsigned NOT NULL default '0',
`itemid` mediumint(8) unsigned NOT NULL default '0',
`supe_pushstatus` tinyint(1) NOT NULL default '0',
`recommends` smallint(6) NOT NULL,
`recommend_add` smallint(6) NOT NULL,
`recommend_sub` smallint(6) NOT NULL,
`heats` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`tid`),
KEY `digest` (`digest`),
KEY `sortid` (`sortid`),
KEY `displayorder` (`fid`,`displayorder`,`lastpost`),
KEY `typeid` (`fid`,`typeid`,`displayorder`,`lastpost`),
KEY `recommends` (`recommends`),
KEY `heats` (`heats`),
KEY `authorid` (`authorid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;


Mr_Bean 2009-12-19
  • 打赏
  • 举报
回复
discuz本身就支持js调用的 你搞那么复杂干吗
Account Activation Overview.zip 在管理员版本里面,新开一页来显示所有等待帐号激活的用户.(管理员激活和一般用户激活).适用phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Admin Overall Forums Permission.zip 这个hack 允许管理人员用鼠标器轻易的一点就设定所有论坛的权限。对于新手来说很适用 Admin Panel for Junior Admins and Mods.zip 允许你设定二级管理人员,并且你也可以准许二级管理人员使用你允许他们使用的所有设定。你也可以同时允许游客使用你预先设定的所有选项.phpBB Version: 2.0.0 - 2.0.1 Admin Private Messages Viewer.zip 这是对于管理员版面额外附加的程序。 它可以显示所有站内信件的列,并且让管理员看到所有的信息。phpBB 版本: 2.0.0 Admin Server Test.zip 此hack 会测试你的server 运行功能,速度,和它是否可以新建和写文件。将来我们会提供更多的测试.phpBB 版本: 2.0.0 Admin Shadow Topic Delete.zip 管理员专用版 附加 可是显示隐藏题目连接(当你移动一个题目后遗留下的连接). 这也会显示一个题目被移动地址的连接,并且让你删除这个隐藏连接.phpBB 版本: 2.0.0 Admin Users List Hack.zip 这个hack提供一个管理您的用户的新方法: 非常有用和方便!你不需搜索任何人.phpBB 版本: 2.0.1 - 2.0.2 Admin Voting这是一个管理员版本的hack, 使得管理员们去查看投票结果,谁参预了此投票,和谁在哪里投什么票.因为牵涉到隐私问题,有这个功能的论坛应当让它的用户得知此功能已在使用.此hack是被Fabro勇敢的从Vote-teilnehmer anzeigen v.1.2.0 更正过来的.phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Allow Avatars only with xx posts 让你的用户在发一定贴数之后才可以使用头像. 你可以预先在管理员面版里面设定贴数.phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Allow Disallow Signature 此hack和avatars很相似-你可以准许/不准许每个用户有自己的签名.phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Allow Unlimited Guest Voting 此hack 允许管理员在论坛里面给所有游客设定投票的权力,并且没有登陆的用户也可在此设定的论坛里面投票。此功能不附带任何跟踪功能,因此游客可以重复投票。phpBB 版本: 2.0.1 - 2.0.2 Auto Un-ban Main Admin 此hack不会防止限制高级管理员,可是此MOD可以在没错网页刷新时解除对于高级管理员的限制(假如高级管理员被限制).phpBB 版本: 2.0.0 Configurable online trading time 此hack让管理员通过控制面版查看用户在线持续时间(以秒计算)。 这个时间将会在"线上人数"里面显示.phpBB 版本: 2.0.0里面显示. " Control Panel modcp Modification 类似于悄悄话:这个功能可以让您一次选modcp里面的全部贴子。使得您更方便的选择贴子phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Delete Inactive Users 此程序让你可以删除不活跃的用户。 它包含很多数据,如加入日期,从未登陆,等等.管理员可以建立删除用户的连接。phpBB 版本: 2.0.2 Edit Joined Date per Admin Panel 用此hack, 你可以轻松的修改用户的加入日期. phpBB 版本: 2.0.0 - 2.0.1 - 2.0.2 Edit User s Post Count 修改用户管理面版里面的用户发贴计数。如果某用户因发重复的贴因而积累了很多发贴计数,你可用此功能使得数字回复正常.phpBB 版本: 2.0.1 Enhanced Admin User Lookup 这将会代替管理员面版里面的用户搜索,以更多功能来方便管理员使用。phpBB 版本: 2.0.0 Global Annoucement Hack 此MOD让你更容易的发使得所有版都可以看到的公告。 它支持管理员,你可以设定可以看此贴的用户,可

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧