我正在使用CodeIgniter构建一个基本论坛,我遇到两个MySQL查询问题。
以下是我的表格:
mysql> describe forum_posts;
+----------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+-------------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| topic_id | int(11) | YES | MUL | NULL | |
| user_id | int(11) | YES | MUL | NULL | |
| post | text | YES | | NULL | |
| date | timestamp | YES | | CURRENT_TIMESTAMP | |
| ip | varchar(15) | YES | | NULL | |
+----------+------------------+------+-----+-------------------+----------------+
6 rows in set (0.01 sec)
mysql> describe forum_topics;
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| category_id | int(11) | YES | MUL | NULL | |
| user_id | int(11) | YES | MUL | NULL | |
| name | varchar(100) | YES | | NULL | |
| importance | tinyint(2) | YES | | 0 | |
+-------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
mysql> describe forum_categories;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| order | tinyint(2) | YES | | 0 | |
+-------+------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
1)我想选择所有类别及其各自的最新帖子 2)我想从id为X的类别中选择所有主题,并在此主题中显示最后一篇帖子。
这是我到目前为止所做的事情
(1):
SELECT
C.*,
T.name AS topic_name,
T.id AS topic_id,
P.date AS post_date
FROM forum_categories AS C
LEFT JOIN
(
SELECT id, category_id, name
FROM forum_topics
ORDER BY id DESC
)
T ON C.id = T.category_id
LEFT JOIN
(
SELECT id, topic_id, date
FROM forum_posts
ORDER BY DATE(date) DESC
)
P ON T.id = P.topic_id
GROUP BY C.id
ORDER BY DATE(P.date) DESC
(2):
SELECT
T.*,
P.topic_id,
P.id AS post_id,
P.user_id,
P.date,
users.username
FROM forum_topics AS T
LEFT JOIN
(
SELECT id, topic_id, user_id, date
FROM forum_posts
ORDER BY id DESC
)
P ON P.topic_id = T.id
LEFT JOIN
users ON P.user_id = users.id
WHERE T.category_id = '1'
GROUP BY P.topic_id
ORDER BY
T.id DESC,
P.id DESC
LIMIT 10
基本上我的问题是我不能先对子查询进行ORDER,然后对它们进行GROUP。
此外,我不确定这些问题是否足够有效。我正在研究子查询。他们会慢吗?
答案 0 :(得分:0)
无法测试,这是我想尝试的想法。可能不是其他人会怎么做,但逻辑至少应该帮助你指明方向。我相信批评者会出来,但你知道,没有人回答这个,所以我想我会试着让你朝着一个方向前进!
SELECT * FROM forum_categories $catArray ^^ SELECT p.*, t.* FROM forum_posts p, forum_topics t, forum_categories c WHERE t.category_id = c.id AND p.topic_id = t.id ORDER BY c.order ASC, p.date DESC GROUP BY t.id $postArray^^ for ($x = 0; $x < count($postArray); $x++) { for ($y = 0; $y < count($catArray); $y++) { if ($catArray[$y]['id'] == $postArray[$x]['category_id']) { $catData = $catArray[$y]; break; } } if ($catData['id'] != $currentCat) { PRINT CATEGORY >> $catData['name'] } PRINT TOPIC >> $postArray[$x]['name'] PRINT NEWEST POST >> $postArray[$x]['post'] $currentCat = $catData['id']; }
答案 1 :(得分:0)
经过几个小时的撞击我的头后,我想我找到了(1)的解决方案,现在更容易找到(2)的解决方案。
SELECT
C.id,
C.name AS category_name,
C.order AS category_order,
T.*
FROM forum_categories AS C
LEFT JOIN
(
SELECT
T.category_id,
T.id AS topic_id,
T.name AS topic_name,
P.user_id,
P.username,
P.date
FROM forum_topics AS T
LEFT JOIN
(
SELECT
P2.id AS post_id,
P2.topic_id,
P2.user_id,
P2.date,
U.username
FROM forum_posts AS P2
LEFT JOIN users AS U ON P2.user_id = U.id
ORDER BY P2.id DESC
)
P ON P.topic_id = T.id
ORDER BY P.post_id DESC
)
T ON T.category_id = C.id
GROUP BY C.id
编辑:修复了(1)查询中的一个小错误,对于那些想要完成与我相同的人来说,这里是(2):
SELECT
T.*,
P.*
FROM forum_topics AS T
LEFT JOIN
(
SELECT
P2.id AS post_id,
P2.topic_id,
P2.user_id,
P2.date,
U.username
FROM forum_posts AS P2
LEFT JOIN users U ON U.id = P2.user_id
ORDER BY P2.id DESC
)
P ON P.topic_id = T.id
WHERE T.category_id = '1'
GROUP BY P.topic_id
ORDER BY P.topic_id DESC