2011-07-25 134 views
3

我有一個表稱爲用戶 此表是什麼樣子問題與MySQL查詢

CREATE TABLE `users` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(32) NOT NULL, 
    `password` varchar(60) NOT NULL, 
    `email` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

最後我有一個表叫朋友, 此表是什麼樣子

CREATE TABLE `friends` (
    `friendship_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id1` bigint(20) unsigned NOT NULL, 
    `user_id2` bigint(20) unsigned NOT NULL, 
    `time_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`friendship_id`), 
    KEY `user_id1` (`user_id1`), 
    KEY `user_id2` (`user_id2`), 
    CONSTRAINT `friends_ibfk_1` FOREIGN KEY (`user_id1`) REFERENCES `users` (`id`), 
    CONSTRAINT `friends_ibfk_2` FOREIGN KEY (`user_id2`) REFERENCES `users` (`id`) 
) 

所以基本上如果userA跟隨userB,那麼一行將被添加到friends表中,屬性user_id1是userA,user_id2是userB。

即時通訊試圖編寫一個搜索框的MySQL查詢。用戶將輸入一個字符串,查詢將抓取包含該字符串的用戶列表,但用戶所關注的人員需要首先顯示。

所以如果我們有3個用戶

  • 插孔
  • 傑森
  • 約翰

如果用戶Chris(誰在關注傑森)在搜索框輸入字符串 'JA',該查詢將按照jason,jack的順序抓取用戶列表。因爲傑森跟隨克里斯。

從我的理解,我想可能一組由問題,我嘗試了不同的查詢,但我不能得到所需要的結果

做你們有什麼想法?

非常感謝

+0

我真的不得到你的問題,你想改變結果的順序,或者你需要給已有的友誼作爲第一行?顯示你運行什麼查詢來獲取用戶。 – Tim

+0

我只是想抓取用戶從數據庫,但我想要的朋友先顯示,然後非朋友 –

回答

2

你必須爲分類做了一招,讓友誼得到一個0和非友誼在臨時場拿到1,然後我們升序排列此字段和第二我們排序用戶名

SELECT x.username 
FROM users x LEFT JOIN friends y ON x.id=y.user_id2 AND y.user_id1=$LOGGED_IN_USER 
WHERE LOWER(x.username) LIKE 'ja%' 
ORDER BY CASE WHEN y.user_id2 IS NULL THEN 1 ELSE 0 END,x.username 

@thanks到scwagner指着我延長JOIN子句

+1

在JOIN一定要包括「和y_user_id1 = $(LoggedInUserId)」,否則如果任何人有一個朋友匹配的名稱那麼你會把它們排在最前面。 – scwagner

+0

感謝您的答案@rabudde 我試過你的查詢,但我沒有工作 這裏是錯誤 錯誤1064(42000):你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'WHERE LOWER(t.username)LIKE'ha%' ORDER BY CASE WHEN y'user_id2 IS NULL THEN 1'在第1行附近使用正確的語法 –

+1

抱歉,在ORDER BY-clause中有一個AS order_field,請刪除它(或者參考編輯答案) – rabudde