2012-07-02 138 views
3

我有4個表。具有標記(user_id, username, and namemysql連接表

  • 表B - - 具有用戶

    1. 表A(token_id, user_id)。每個用戶有10個標記條目。每個令牌只能分配給一個用戶。一個用戶有多個標記(10)
    2. 表C是商場遊戲 - (arcade_id, token_id, name, levels, lives)。只有一個令牌只能分配給一個街機遊戲。
    3. 表D即獎品 - (prize_id, token_id, name, length, width, height)。只有一個令牌只能分配給一個獎品。

    令牌被分配給街機遊戲或獎品,或者分配給任何一個但不是兩個。

    我的問題是如何設置MySQL連接查詢來確定給定用戶的哪些標記分配給遊戲或獎品或尚未分配。我的桌子佈局是否最佳?或者你有其他佈局的建議嗎?

    這裏是我的表:

    mysql> select * from users; 
    
    +---------+--------+ 
    | user_id | name | 
    +---------+--------+ 
    |  1 | User 1 | 
    |  2 | User 2 | 
    |  3 | User 3 | 
    |  4 | User 4 | 
    +---------+--------+ 
    
    mysql> select * from tokens; 
    
    +----------+---------+ 
    | token_id | user_id | 
    +----------+---------+ 
    |  1 |  1 | 
    |  2 |  1 | 
    |  3 |  2 | 
    |  4 |  2 | 
    |  5 |  2 | 
    |  11 |  2 | 
    |  6 |  3 | 
    |  7 |  3 | 
    |  10 |  3 | 
    |  8 |  4 | 
    |  9 |  4 | 
    +----------+---------+ 
    
    mysql> select * from prizes; 
    
    +----------+----------+-----------+ 
    | prize_id | token_id | prizename | 
    +----------+----------+-----------+ 
    |  1 |  4 | prize 1 | 
    |  2 |  7 | prize 2 | 
    |  3 |  8 | prize 3 | 
    |  4 |  9 | prize 4 | 
    +----------+----------+-----------+ 
    
    mysql> select * from arcade; 
    
    +-----------+----------+----------+ 
    | arcade_id | token_id | gamename | 
    +-----------+----------+----------+ 
    |   1 |  1 | game 1 | 
    |   2 |  2 | game 2 | 
    |   3 |  3 | game 3 | 
    |   4 |  5 | game 4 | 
    |   5 |  11 | game 6 | 
    +-----------+----------+----------+ 
    

    我想一個SQL查詢我在哪裏可以得到以下信息:

    對於用戶1,他們有2個令牌 - 令牌ID 1分配遊戲1和令牌標識2被分配給遊戲2

    或者對於用戶2 - 它們具有4個令牌 - 令牌標識3被分配給遊戲3,令牌標識4被分配給獎勵1,令牌標識5被分配給遊戲4 。

    或對於用戶3 - 他們有3個令牌 - 令牌ID 6尚未分配,令牌ID 7是獎2,令牌ID 10未分配

    等等。

    我想建立這樣

    Select **** 
        from ***** 
    Where user_id = 1 
    

    MySQL查詢字符串,如果我指定的用戶ID並獲得以上所有信息。

  • +0

    可以請您提供http://sqlfiddle.com –

    回答

    1

    試試這個查詢,但如果有一些數據我將能夠檢查雖然我已經包含編輯
    然後,它應該是最簡單的事

    select * 
    from `user` 
        left join token 
        on user.user_id = token.user_id 
        left join games 
        on games.token_id = token.token_id 
        left join prize 
        on prize.token_id = token.token_id 
    where user.user_id = 1 
    
    虛擬數據

    select 
        t.token_id, 
        IFNULL(g.game,'') as Game, 
        IFNULL(p.name,'') as Prize, 
        case when g.game != '' then 'Assigned' when p.name != '' then 'Assigned' else 'Not assigned yet' end as `Status` 
    from token as t 
        left join (select * 
         from games 
         where token_id not in(select 
            token_id 
            from prize)) as g 
        on g.token_id = t.token_id 
        left join (select * 
         from prize 
         where token_id not in(select 
            token_id 
            from games)) as p 
        on p.token_id = t.token_id 
    

    檢查

    +0

    一些示例數據我用我的表更新了這篇文章。這有幫助嗎? –