2011-10-05 78 views
2

我是新來的網絡編程,我試圖做一個微博克隆。在這一點上,我有3個表:「子查詢返回多於一行」錯誤。

用戶(ID,姓名)

  • ID是用戶
的自動生成的ID
  • tweets(id,content,user_id)

    • id是自動生成的ID
    • 內容是鳴叫的文本
    • user_ID的是,發的帖子
    用戶的ID

    追隨者(ID,USER_ID,following_id )

    • id是自動生成的ID
    • user_id是誰在做以下
    • following_id用戶是遵循

    所以,作爲新SQL作爲好,我想建立一個SQL語句,將返回的鳴叫用戶是當前登錄的用戶以及他所關注的每個人。

    我試圖使用這個語句,有時會起作用,但有時會出現一個錯誤,指出「子查詢返回多於一行」。以下是該語句:

    SELECT * FROM tweets 
    WHERE user_id IN 
    ((SELECT following_id FROM followers 
    WHERE user_id = 1),1) ORDER BY date DESC 
    
    • 我把1來作爲例子,這將是當前登錄的用戶的ID。

    我對這個聲明沒有任何運氣,任何幫助將不勝感激!謝謝。

    +0

    既然你提到你是網絡編程新手,這可能是有幫助的:http://stackoverflow.com/questions/65512/which-is-faster-best-select-or-select-column1-colum2-column3-etc它的良好做法不使用select * incase表結構的變化等,prob不會影響你的項目,但它是一個很好的習慣,以進入使用列,而不是選擇* – Purplegoldfish

    +0

    謝謝,這絕對是良好的做法,拿起! – kurisukun

    回答

    4
    SELECT * 
    FROM tweets 
    WHERE 
        user_id IN (SELECT following_id FROM followers WHERE user_id = 1) 
        OR user_id = 1 
    ORDER BY date DESC 
    
    +0

    謝謝,這也適用!在這兩者中,使用子查詢還是工會通常會更好? – kurisukun

    +0

    子查詢通常被認爲效率低下並且不被推薦,但是看到您仍在學習sql,儘可能讓事情儘可能簡單,簡短和可讀。我不想更改你的代碼太多。正如Dems所說,在sql中有很多方法可以做同樣的事情,它們都有其優點和缺點。 –

    2

    嘗試,即使你有沒有關注你的用戶

    還有與連接解決這個

    SELECT * FROM tweets WHERE user_id = [YourUser] 
    UNION 
    SELECT * FROM tweets WHERE user_id in (SELECT following_id FROM followers WHERE user_id ? [YourUser] 
    

    應工作,但實際上我在趕時間。我會盡快寫出查詢。那麼其他一些人可能會回答。抱歉。

    +0

    謝謝!這工作正常! – kurisukun

    6

    在一個評論中,你問了is it generally better to use a subquery or a union。不幸的是,沒有簡單的答案,只是一些信息。


    有些品種的SQL優化具有IN子句如果lsit大的問題,並可能在以下任何一種方式更好的表現...

    SELECT * FROM tweets 
    INNER JOIN followers ON tweets.user_id = followers.following_id 
    WHERE followers.user_id = 1 
    
    UNION ALL 
    
    SELECT * FROM tweets 
    WHERE user_id = 1 
    

    或...

    SELECT 
        * 
    FROM 
        tweets 
    INNER JOIN 
        (SELECT following_id FROM followers WHERE user_id = 1 UNION SELECT 1) AS followers 
        ON tweets.user_id = followers.following_id 
    

    或者......

    SELECT 
        * 
    FROM 
        tweets 
    WHERE 
        EXISTS (SELECT * FROM followers WHERE following_id = tweets.user_id and user_id = 1) 
        OR user_id = 1 
    

    有很多,很多的替代品......


    有些品種SQL鬥爭的優化OR條件,並最終檢查的鳴叫表中的每個記錄,而不是使用一個索引。這會使UNION選項更可取,因爲查詢的每一半都會從user_id字段的索引中受益。

    但是你實際上可以完全重構你的代碼中的這個角落案例:讓每個用戶成爲他們自己的追隨者。這意味着,爲追隨者獲取推文自​​然會包括用戶自己。這在所有情況下是否合理取決於您的設計和其他功能要求。


    總之,最好的辦法是創建一些有代表性的數據和測試的選項。但我現在不會真的擔心它。只要你把這個代碼封裝在一個地方,你可以選擇一個你最喜歡的代碼。然後,當系統的其他部分散開,並且您更加確信事物不會改變時,您可以返回並根據需要優化

    +0

    100%同意。 SQL提供了許多機會,對於另一種情況,正確的選擇問題往往是一個大問題。生成測試用例(數據量,併發用戶)是正確選擇解決方案的唯一方法! – BigMike

    +0

    謝謝,這是非常豐富的! – kurisukun

    相關問題