这个问题就像一个论坛
当您在论坛中列出主题时,通常需要获得以下内容:
- 主题
- 作者姓名
- 发布日期
- 观看次数
- 最后答复的姓名
- 上述答复日期
直接就是。
但问题不在于将数据插入数据库,也不是更新行
问题是:列出以下 + 一个查询。
你可能会说:嘿,这并不困难,你说你把它们存储在数据库中,所以只需要获取它们。完成!
好吧,如果我暂时根据他/她的名字存储作者姓名,那可能很容易。但有人可能会注意到你的Facebook朋友每3个月更改一次“REAL NAME”。我想获得最新的名称,然后显示它。所以将名称存储为作者或最后一个回复是行不通的。
有些人可能知道我是怎么做的,是的,你知道了。我用他们的UserID存储它们。所以我有2个表来存储线程和成员(实际上线程的内容是3,但此时并不重要)。 这是我的表结构:
Table: User (Part of the table)
UserID | LastName | FirstName
-------------------------------
1 | Bill | Gates
2 | Steve | Jobs
3 | Chun Ying | Leung
Table: Thread (Part of the table)
ThreadID | Subject | AuthorID | LastID
---------------------------------------
1 | Hello | 1 | 3
2 | World | 3 | 2
通过使用PHP,我想展示我在开始时提到的所有内容(现在只是忘记日期和视图数量)。 喜欢这个:
Subject Author Last Reply
------------------------------------------------------
Hello Bill Gates Chun Ying Leung
World Chun Ying Leung Steve Jobs
那我到底做了什么?很简单,只需将每个帖子分成多个查询 。因此,如果我需要在一个页面中显示100个线程,我将不得不向我的数据库询问401次。这就是为什么我在这里要求更好的解决方案。 我知道以下代码很愚蠢但只是看看......
SQL:
SELECT * FROM threads ORDER BY ThreadID
PHP:
while($row = $db->fetch_array($query)) {
$authorLastName = $db->result("SELECT LastName FROM User WHERE UserID = '$row[authorid]'");
// and so on ...
}
这个查询可能很复杂,但我认为解决方案可能很有用。 有什么想法吗?
答案 0 :(得分:1)
加入用户表两次:
SELECT threads.*, author.lastname, last_lastname FROM threads join user author on authorId= author.userId
join user last on LastID= last.userId
ORDER BY ThreadID
答案 1 :(得分:0)
好吧,我可能会得到它。
使用JOIN可能是一个很好的解决方案
(如果用户有效并且没有被某人删除)
但我也是这样找到的。 (使用INNER JOIN)
SELECT t.*,
au.lastname AS aulastname,
au.firstname AS aufirstname,
lr.lastname AS lrlastname,
lr.firstname AS lrfirstname
FROM thread t, User au, User lr
WHERE t.authorid = au.userid
AND t.lastid = lr.userid
希望这会奏效!
现在我也找到了另一种方式(使用LEFT JOIN)
SELECT t.*,
au.lastname AS aulastname,
au.firstname AS aufirstname,
lr.lastname AS lrlastname,
lr.firstname AS lrfirstname
FROM thread t
LEFT JOIN User au ON t.authorid = au.userid
LEFT JOIN User lr ON t.lastid = lr.userid
这应该可以解决我的问题。