SELECT语句在另一个SELECT语句中

时间:2012-01-04 22:03:01

标签: php mysql sql

我有两个名为messagesusers的表。在messages表中,有一个字段是users表的外键,基本上是用户ID。我试图使用SELECT查询从messages表中检索结果,但我想要用户的用户名而不是用户ID。这个SQL是错误的,但我认为它涵盖了我正在尝试做的事情:

SELECT (SELECT username FROM `users` WHERE u_id=?), message, sent FROM `messages` WHERE r_id=? AND sent > ?

基本上,我想使用messages表中存储的用户ID来获取用户的用户名,并在一个查询中从messages表中获取结果。

我认为JOIN是这方面的工具,但我没有任何SQL经验。

感谢。

5 个答案:

答案 0 :(得分:4)

您希望使用公共的u_id列将两个表连接在一起。

SELECT u.username, m.message, m.sent
    FROM messages m
        INNER JOIN users u
            ON m.u_id = u.u_id 
    WHERE m.r_id = ?
        AND m.sent > ?

答案 1 :(得分:1)

inner join

就属于这种情况
select
    u.username,
    m.message,
    m.sent
from
    messages m
    inner join users u on
        m.u_id = u.u_id
where
    m.r_id = ?
    and u.u_id = ?
    and m.sent > ?

你在这里做的是拿messages表并说:“好的,抓住users表中u_idmessages列中的所有内容来自u_id的{​​{1}}列。

users子句会根据您要传递的参数过滤掉结果。

您可以加入表格,这样您就不必只做一个,以备将来参考。

如果您想了解更多关于联接和不同类型的内容,我强烈建议您阅读Atwood的帖子here

答案 2 :(得分:0)

您也可以加入两个这样的表:

SELECT 
    u.username, 
    m.message, 
    m.sent 
FROM 
    messages m,
    users u
WHERE 
    m.r_id=? AND 
    m.sent > ? AND
    m.u_id = u.u_id

m.u_id是消息表中的用户ID

答案 3 :(得分:0)

您可以像这样重构查询:

select 
    u.username, 
    m.message, 
    m.sent 
from 
    (
        select u_id,message,sent
        from messages
        where r_id = ?
        and sent > ?
    ) m 
    inner join 
    (
        select u_id,username
        from users
        where u_id = ?
    ) u using (u_id);

您需要确保在r_id上有复合索引并发送

ALTER TABLE messages ADD INDEX (r_id,sent);

答案 4 :(得分:0)

您的查询只需要稍微更正,然后相当于LEFT JOIN(或INNER JOIN,正如@Joe Stefanelli的回答一样messages.u_id永远不会NULL):< / p>

SELECT
      (SELECT username FROM `users` WHERE u_id = messages.u_id) AS username
     , message
     , sent 
FROM messages  
WHERE r_id = ? 
  AND sent > ?