2015-01-04 92 views
0

任何幫助將讚賞與此查詢我想寫在MySQL中。我有兩個表:在自己內部使用自己的結果的SQL查詢

files (id, name, subject, size, day, hour, username) and 
friendships (user1, user2). 

我想選擇10 most recent行(在ID而言)從表files其中來自每個行username存在於表friendships,與friendshipssecond column等於一些name 'x'

我試圖用這個語句:

SELECT name, 
     subject, 
     size, 
     day, 
     hour, 
     username 
FROM files 
WHERE username IN ((SELECT user1 
        FROM friendships 
        WHERE user2 = 'x') 
        UNION ALL 
        (SELECT user2 
        FROM friendships 
        WHERE user1 = 'x')) 
ORDER BY id DESC 
LIMIT 10; 

但是,我得到一個錯誤。這有什麼問題,有沒有更好的方法?

+0

什麼是錯誤和'MySql'或'Sql-server' –

+0

Mysql。 'UNION ALL(SELECT user2 FROM friendships WHERE user1 ='x'))ORDER BY id DESC LIMI'at line 1 –

+0

你需要別名,因爲它是 – Mihai

回答

1

嘗試刪除大括號。

SELECT name, 
     subject, 
     size, 
     day, 
     hour, 
     username 
FROM files 
WHERE username IN (SELECT user1 
        FROM friendships 
        WHERE user2 = 'x' 
        UNION ALL 
        SELECT user2 
        FROM friendships 
        WHERE user1 = 'x') 
ORDER BY id DESC 
LIMIT 10; 
+0

工作,出於某種原因,我不明白 –

2

我不確定是什麼原因導致你的錯誤,但有一個更好的方法。將其分解成兩個操作。我一般用exists(雖然in可能是罰款):

WHERE EXISTS (SELECT 1 FROM friendships fs WHERE fs.user2 = 'x' and fs.user1 = files.username) OR 
     EXISTS (SELECT 1 FROM friendships fs WHERE fs.user1 = 'x' and fs.user2 = files.username) 

這個製劑允許查詢索引採取更好的優勢,特別是在friendships(user1, user2)friendships(user2, user1)(是的,都是希望在這種情況下)。

+0

所以最後的聲明看起來像?哪裏存在選擇(在這裏查詢)? –

+1

它看起來像你的查詢這個'where'子句。 –