Hi,

Steffan A. Cline wrote:
I am trying to set up a forum where there are main posts with replies and
replies to replies. Rather than using nested queries in my middleware I am
thinking there has to be some kind of recursive query where I can output the
results in a format like so:

MAIN
    Reply to main
        reply to reply to main
    reply to main
        reply to 2nd reply to main
MAIN
    Reply
    reply
....


The table structure is like so:

+-------------------+--------------+------+-----+-------------------+-------
---------+
| Field             | Type         | Null | Key | Default           | Extra
|
+-------------------+--------------+------+-----+-------------------+-------
---------+
| forum_id          | bigint(11)   | NO   | PRI | NULL              |
auto_increment | | project_id | bigint(11) | YES | MUL | 0 | | | forum_reply_id | bigint(11) | YES | MUL | 0 | | | forum_dev_id | bigint(11) | YES | MUL | 0 | | | forum_type | varchar(255) | YES | | | | | forum_subject | varchar(255) | YES | | | | | forum_message | longtext | YES | | NULL | | | forum_date_posted | timestamp | NO | | CURRENT_TIMESTAMP | | +-------------------+--------------+------+-----+-------------------+-------
---------+


Test data is like so

mysql> select * from forums;
+----------+------------+----------------+--------------+------------+------
---------+-------------------------------------------------+----------------
-----+
| forum_id | project_id | forum_reply_id | forum_dev_id | forum_type |
forum_subject | forum_message                                   |
forum_date_posted   |
+----------+------------+----------------+--------------+------------+------
---------+-------------------------------------------------+----------------
-----+
|        1 |         42 |              0 |            1 |            | First
Post    | I am the First!                                 | 2007-07-08
15:09:41 | | 2 | 42 | 1 | 1 | |
| I am a reply to the first                       | 2007-07-08 15:30:36 |
|        3 |         42 |              0 |            1 |            |
sample data   | this is some sample data in a new thread        | 2007-07-08
15:10:03 | | 4 | 42 | 2 | 1 | |
| this is a reply to the reply of the first post. | 2007-07-08 15:33:54 |
+----------+------------+----------------+--------------+------------+------
---------+-------------------------------------------------+----------------
-----+
4 rows in set (0.00 sec)


I am figuring that if the reply_to_id is 0 then it is a parent thread
otherwise it is a child or child of a child etc.

There are many ways to model hierarchies and trees in SQL. The one I think lends itself best to this query is nested sets. Joe Celko's book is the classic on it, though there are good descriptions of it in many places (Pro MySQL, and even for free online, for example the sample chapters in http://www.artfulsoftware.com/). Celko and others also give examples of other methods and the kinds of queries needed for them. I'd have to check, but offhand I don't think there's any way to write the query you want with the data structure you have, unless you use recursive Common Table Expressions, which MySQL doesn't support.

Baron

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to