簡體   English   中英

使用 IN 子句從兩個表中獲取數據

[英]Get data from two tables using IN clause

我想得到什么?

獲取向我發送朋友請求的人的 ID、姓名、電子郵件。 我使用的兩個表,我想根據它們獲取詳細信息

注冊-> id、name、email、firmname 和更多列。

friends_requests ->id,userId,sentRequests,receivedRequests,friends,dates

請參考以下兩張圖片。

好友請求表

在此處輸入圖片說明

報名表

在此處輸入圖片說明

我在嘗試什么?

SELECT * FROM signup WHERE signup.id IN 
(SELECT sentRequests FROM friends_request  WHERE friends_request.userId=46)

此查詢僅提供一條記錄,而如果我使用以下查詢,則會提供 3 條記錄

SELECT * FROM signup WHERE signup.id IN (47,48,49)

我知道為什么第二個查詢會因為 IN 子句和三個 id 給出三個記錄

但是這個查詢也會給出相同的結果,即 47,48,49

SELECT sentRequests FROM friends_request  WHERE friends_request.userId=46

但是為什么第一個查詢沒有給出三個記錄呢?

當兩個值相同時 那為什么結果不一樣呢?

關於表friends_requests。 列 sentRequests 違反1NF
如果我是對的,IN 操作員會以完整字符串的形式獲取您的信息,而不是作為單獨的 ID 信息。

SELECT * 
FROM signup 
WHERE signup.id IN ('47,48,49')
what is operator thinks IN ('47,48,49')
what You think IN (47,48,49)

您必須將列值 '47,48,49' 拆分為返回行,以便操作員可以理解,如果您想使用 IN 運算符...

為了讓它像你編碼的那樣工作,

SELECT sentRequests FROM friends_request  WHERE friends_request.userId=46

將不得不給出 3 行 47,48,49。 因為 sentRequests 是一個字符串,所以它給一行 47,48,49

如果您希望 3 個值與:

select * from #signup a where exists (select 1 from friends_request b where  ','+sentRequests+',' like ',%'+cast(id as varchar(5))+',%')

嘗試這個...

SELECT * FROM signup WHERE id IN (
SELECT 
    DISTINCT cast(SUBSTRING_INDEX(SUBSTRING_INDEX(sentRequests, ',', n.digit+1), ',', -1) AS signed) sentRequests
FROM friends_request INNER JOIN (
    SELECT 
        0 digit 
    UNION ALL 
        SELECT 1 
    UNION ALL 
        SELECT 2 
    UNION ALL 
        SELECT 3 
    UNION ALL 
        SELECT 4 
    UNION ALL 
        SELECT 5 
    UNION ALL 
        SELECT 6
   ) n ON LENGTH(REPLACE(sentRequests, ',' , '')) <= LENGTH(sentRequests)-n.digit
        WHERE userId = 46
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM