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