2011-01-19 62 views
2

我有一個重大問題得到它正常工作。這筆交易。與許多表的mysql

我有4個表 - timelineconnectionsimagesvotes

時間軸表:

time_id 
time_title 

時間軸表通過連接表與圖像連接表

連接表:

time_id 
image_id 

所以連接容納約 「後」 的ID的時間表和有關圖片ID信息

圖片表:

image_id 
image_url 
image_type 

圖像表包含圖像,可以在同一個時間線(後)使用,所以我可以通過查看連接表來查看連接。

我也有保存有關票信息的具體時間表後

投票表中的投票表:

vote_id 
time_id 

票表包含了各個TIME_ID的許多行和想法是計數最熱門的次數

因此繼承人的問題: 我需要得到5個最多投票time_titles並顯示他們與冷杉即最高投票

  • 圖像2對應於標題2 - - 每個time_title(後),以便它看起來像這樣例如

    • 圖像1對應於標題1 t圖像作爲第二最高投票

    每個時間表行(後)可包含多個圖片,我只想要顯示第一的每個崗位。

    希望你明白我的問題!

    非常感謝!

  • +2

    這不是IM,你不必把每一句話都在自己的行... – BoltClock 2011-01-19 11:33:00

    回答

    2

    查詢將被

    SELECT 
    count(v.vote_id) as vote_times 
    t.time_title, 
    ( 
        SELECT 
        image_url 
        FROM 
        images 
        WHERE 
        image_id = (
         SELECT 
         image_id 
         FROM 
         connections as c 
         WHERE 
         c.time_id = t.time_id 
         LIMIT 1 
        ) 
        LIMIT 1 
    ) as image_url 
    FROM 
    votes as v 
        LEFT JOIN 
        time as t 
        on 
        t.time_id = v.time_id 
    GROUP BY 
    v.time_id 
    ORDER BY 
    vote_times desc 
    LIMIT 5; 
    

    這是可行的,但可能不是最優化的一個。

    - 編輯 得到IMAGE_TYPE也儘量

    SELECT 
        count(v.vote_id) as vote_times 
        t.time_title, 
    i.image_url, 
    i.image_type 
    
    FROM 
        votes as v 
         LEFT JOIN 
          time as t 
           on 
            t.time_id = v.time_id 
        LEFT JOIN 
        images as i 
        on 
        i.image_id = (
         SELECT 
          image_id 
         FROM 
          connections as c 
         WHERE 
          c.time_id = t.time_id 
         LIMIT 1 
         ) 
    GROUP BY 
        v.time_id 
    ORDER BY 
        vote_times desc, image_type desc 
    LIMIT 5; 
    
    1
    SELECT t.time_title, i.* 
    FROM (
         SELECT t.time_title 
         FROM timeline t 
         LEFT JOIN 
           votes v 
         ON  v.time_id = t.time_id 
         GROUP BY 
           t.id 
         ORDER BY 
           COUNT(vote_id) DESC, t.time_id DESC 
         LIMIT 5 
         ) t 
    JOIN images i 
    ON  i.id = 
         (
         SELECT ii.image_id 
         FROM connections c 
         JOIN image ii 
         ON  ii.image_id = c.image_id 
         WHERE c.time_id = t.time_id 
         ORDER BY 
           ii.id DESC -- or whatever order you define for the "first" image 
         LIMIT 1 
         ) 
    
    +0

    'WHERE ii.time_id = T。 id`圖像表沒有`time_id`,它在連接表中。 – 2011-01-19 11:49:26

    +0

    @Anush:你說得對,正確。 – Quassnoi 2011-01-19 11:58:59