繁体   English   中英

另一个SELECT语句中的SELECT语句

[英]SELECT statement inside another SELECT statement

我有两个表,分别称为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表中获取结果。

我认为JOINs是实现此目的的工具,但是我几乎没有SQL经验。

谢谢。

您想使用公用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 > ?

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_id从列messages等于u_id从列users

然后where子句根据要传递的参数向下过滤结果。

您可以随意加入表格,因此不必做任何事,以备将来参考。

如果您想了解有关联接和不同类型的更多信息,强烈建议您在此处阅读Atwood的相关文章。

您也可以像这样连接两个表:

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是消息表中的用户标识

您可以像下面这样稍微重构查询:

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);

您的查询只需要稍作更正,然后等效于LEFT JOIN (或INNER JOIN ,如果messages.u_id永远不为NULL ,则与@Joe Stefanelli的答案完全相同):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM