2012-12-24 68 views
0

好了,即時通訊工作了針對MySQL的搜索功能,但所遇到的東西,我似乎無法工作了。我正在嘗試製作一個腳本來搜索用戶朋友,並以更高的分數返回朋友。這是我到目前爲止:MySQL的UNION,ORDER BY和報表全部在一個查詢

SELECT id, first_name, last_name, image_id FROM users 
WHERE id IN (
    SELECT receiver AS friend FROM friends WHERE initiator = :me AND status = :status   
    UNION 
    SELECT initiator AS friend FROM friends WHERE receiver = :me AND status = :status 
) ORDER BY score AND concat(first_name, ' ', last_name) LIKE '%test query%'; 

現在一切正常,直到我嘗試按Score排序的朋友。任何人都可以鍛鍊如何通過分數來訂購朋友嗎?如果你需要我澄清任何問題。

我有以下兩個表。

用戶表enter image description here

朋友表:enter image description here

如這裏請求是一些示例數據:

作爲一個例子,我有三個用戶:

ID: 1, first_name: Michael, last_name: Sample 
ID: 2, first_name: John, last_name: Citizen 
ID: 3, first_name: Caitlin, last_name: Wired 

的第一個條目下面將邁克爾和凱特琳通過表明邁克爾發起好友請求和凱特琳(接收器)接受了它成爲朋友。 (因此1的狀態),他們的基本分數爲10,第二個條目顯示,約翰也是朋友凱特琳(由凱特琳啓動),但有一個更好的成績。

ID: 10000, initiator: 1, receiver: 3, status: 1, score: 10 
ID: 10001, initiator: 3, receiver: 2, status: 1, score: 20 

所以在這個樣本數據的情況下。如果Caitlin是尋找她的朋友的用戶,那麼它應該顯示John而不是Michael。

+0

你可以添加樣本數據與預期的結果嗎? –

+0

適當[示例代碼](http://sscce.org/)(這裏,SQL語句)比任何ad hoc模式或屏幕截圖更有用。請爲[samples]使用CREATE TABLE和INSERT ... VALUES(http://weblogs.sqlteam.com/jeffs/archive/2008/05/13/question-needed-not-answer.aspx)。所需的結果不需要作爲示例代碼呈現,因爲結果是代碼的輸出,而不是代碼本身。 – outis

+0

當你說「一切正常」時,它意味着它不能按照你想要或預期的方式工作。你究竟得到了什麼,這與你的期望有什麼不同? – outis

回答

3

外語句只從users列,它不具有score列選擇。幾乎所有使用子選擇的語句都可以(也應該)使用連接重寫。在這種情況下,它將允許在條款中使用所有friends字段。

SELECT u.id, u.first_name, u.last_name, u.image_id 
    FROM users AS u 
    JOIN friends AS f 
     ON ... 

在子選擇的WHERE子句中使用的表達式成爲連接條件。聯合是在某種意義上等同於OR(均爲基本conjunctions)。

 ON (u.id = f.receiver AND f.initiator=:me AND status=:status) 
     OR (u.id = f.initiator AND f.receiver=:me AND status=:status) 

的聲明幾乎保持原樣的其餘部分。

WHERE concat(first_name, ' ', last_name) LIKE '%test query%' 
    ORDER BY score 
; 

總之,這就是:

SELECT u.id, u.first_name, u.last_name, u.image_id 
    FROM users AS u 
    JOIN friends AS f 
     ON (u.id = f.receiver AND f.initiator=:me AND status=:status) 
     OR (u.id = f.initiator AND f.receiver=:me AND status=:status) 
    WHERE concat(first_name, ' ', last_name) LIKE '%test query%' 
    ORDER BY score 
; 

請注意,這是未經測試,只是把我的頭頂部。

+0

絕妙的擊穿!完美的作品。非常感激。 – MichaelH

0
  • 你沒有選擇得分
  • 聯合查詢在外部查詢

如訂購與工會

SELECT T.* /*ANY COLUMN SET WITH(OUT) SCORE */ FROM(
SELECT SCORE,.... FROM ANOTHERTABLE WHERE ..... 
UNION SELECT SCORE,.... FROM ANOTHERTABLE WHERE ... 

) T 
ORDER BY SCORE 

更好rewite訂購

SELECT id, first_name, last_name, image_id FROM users 
JOIN (
SELECT score,receiver AS friend FROM friends WHERE initiator = :me AND status = :status   
UNION 
SELECT score,initiator AS friend FROM friends WHERE receiver = :me AND status = :status 
) t ON T.ID = users.id ORDER BY score AND concat(first_name, ' ', last_name) LIKE '%test query%';