Mysql内部联接/在一个查询中进行多选


Mysql inner join/ multiple selects in one query?

大家好

我正在编写一本留言簿(针对每个用户进行个性化设置)。我有一张用户用的桌子和另一张留言簿用的桌子。现在,我目前显示帖子作者姓名的方式并不理想。我只是在DB中有一行"fromname",即作者名称。我想根据作者ID选择作者名称,并将其与"用户"表中的姓名相匹配。

所以。。。这是我现在的mysql查询:

$sql = " SELECT 
             pid,toid,fromid,message,fromname,name,pdate,flag 
         FROM gbook INNER JOIN users 
         ON id='{$_GET['id']}' 
         WHERE toid='{$_GET['id']}' 
         ORDER BY pdate DESC";

我想我需要喜欢。。。在不同的条件下但在同一查询中选择名称。但我不知道怎么做。

我希望你能理解我的问题。我们将非常感谢您的帮助!

/Ja傻瓜

假设您的users表有一个名为username的列,那么以下内容应该可以满足您的需要:

SELECT 
    pid,
    toid,
    fromid,
    message,
    u.username, 
    name,
    pdate,
    flag 
FROM gbook INNER JOIN users u
  ON id='{$_GET['id']}' 
WHERE toid='{$_GET['id']}' 
ORDER BY pdate DESC"

我所做的只是将用户表别名为u,并引用u.username,而不是以前的fromname。

从我所看到的情况来看,由于有fromidtoid,您似乎需要链接到users表两次。如果您有一个用户表,为什么在gbook表中有一个fromname字段?无论如何,如果我的假设是正确的,那么你可能对以下查询感兴趣:

SELECT g.*, u1.username AS ToUser, u2.username AS FromUser
  FROM gbook AS g
  INNER JOIN users AS u1 ON u1.id = g.toid
  INNER JOIN users AS u2 ON u2.id = g.fromid
WHERE g.toid = '{$_GET['id']}' 
ORDER BY g.pdate DESC

在留言簿表中对名称进行硬编码确实很脏。假设你的表格结构是这样的:

用户(id,name)gbook(pid、toid、fromid、message、fromname、name、update、flag)

您的查询已经基本可以了。只需按以下方式更改即可选择两个表的所有列:

$sql = " SELECT *
         FROM gbook g INNER JOIN users u
         ON u.id=g.fromid 
         WHERE toid='{$_GET['id']}' 
         ORDER BY pdate DESC";

然后你可以用类似的东西显示名称

$result = mysql_query($sql);
while( $val = mysql_fetch_array($result) )
{ 
  $username = $val["u.name"];
}