我有两个名为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
表中获取结果。
我认为JOIN是这方面的工具,但我没有任何SQL经验。
感谢。
答案 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_id
列messages
列中的所有内容来自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 > ?