簡體   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