[英]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.