在一个查询中获取作者用户名和上次更新用户名

时间:2015-01-13 07:11:54

标签: php mysql

这个问题就像一个论坛 当您在论坛中列出主题时,通常需要获得以下内容:

- 主题
- 作者姓名
- 发布日期
- 观看次数
- 最后答复的姓名
- 上述答复日期

直接就是。
但问题不在于将数据插入数据库,也不是更新行 问题是:列出以下 + 一个查询

你可能会说:嘿,这并不困难,你说你把它们存储在数据库中,所以只需要获取它们。完成!

好吧,如果我暂时根据他/她的名字存储作者姓名,那可能很容易。但有人可能会注意到你的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 ...
}

这个查询可能很复杂,但我认为解决方案可能很有用。 有什么想法吗?

2 个答案:

答案 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

这应该可以解决我的问题。