[英]SELECT statement inside another SELECT statement
我有两个表,分别称为messages
和users
。 在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.