2013-05-27 40 views
2

我有一個武術網站,我在一張桌子上有用戶,他們在另一張桌面上獲得了安全帶。下面是一些例子表/數據,以幫助說明我的問題:PHP/MySQL - 編寫SQL查詢需要幫助

Users表:

+---------------------+ 
| Users    | 
+---------------------+ 
| userid | name  | 
+---------------------+ 
| 1 | Fred Smith | 
+---------------------+ 

Belts表:

+------------------------------------------+ 
| id | userid | belt_colour | awarded_date | 
+------------------------------------------+ 
| 1 | 1 | blue  | 2007-01-01 | 
+------------------------------------------+ 
| 2 | 1 | purple | 2008-01-01 | 
+------------------------------------------+ 
| 2 | 1 | brown  | 2009-01-01 | 
+------------------------------------------+ 

我的問題是這樣的:當您單擊棕色,查看全部棕色腰帶我希望你看到弗雷德。我不想讓弗雷德出現在藍色和紫色腰帶列表中(這是目前正在發生的事情)。

我竭力拿出那是這樣的查詢:

顯示我的所有用戶,其中帶= $帶,但只有當他們沒有一個更高的帶一個條目。

又如:我是紫色,但是當我出現在藍色名單,因爲我的藍色腰帶的細節都在皮帶表太:-(

不勝感激任何援助

+0

假如那是3,1,褐... ...? – Strawberry

+0

它的實施和現在的工作 - 非常感謝每個人的幫助! –

回答

3

假設高帶意味着更高的awarded_date,一種選擇是讓awarded_date的MAX爲每個用戶,並加入迴帶表:

SELECT u.userId, u.name 
FROM Users u 
    JOIN (
     SELECT userId, MAX(awarded_date) max_awarded_date 
     FROM Belts 
     GROUP BY userId 
    ) maxb ON u.userId = maxb.userId 
    JOIN Belts b ON b.userId = maxb.userId 
     AND b.awarded_date = maxb.max_awarded_date 
WHERE b.belt_colour = 'brown' 
1

排序_awarded_date_降序。並且限制了1的結果。

由於每個腰帶都是一個接一個地被授予,最近的是你想要展示的腰帶。所以,你的查詢會是這樣的:

select * from Users u, Belts b where u.userid = b.userid order by awarded_date limit 1; 

希望這會有所幫助。

0

讓我們分裂這個問題有兩種:

  1. 首先,你需要顯示最近帶的每個人
  2. 然後,你需要證明有帶人

那麼,我們開始吧。

步驟1.a.對每一位用戶

select b.* 
from 
    belts as b 
    inner join (
     select max(id) as maxId from belts group by userId 
    ) as a on b.id = a.maxId 

最新的帶記錄我假設id領域始終是增量。

步驟1.b.加入步驟(1.a.)與用戶的數據

select u.*, b.* 
from 
    users as u 
    inner join (
    select b.* 
    from 
     belts as b 
     inner join (
      select max(id) as maxId from belts group by userId 
     ) as a on b.id = a.maxId 
    ) as b on u.userId = b.userId 

步驟2.選擇所有用戶都具有給定帶

select u.*, b.* 
from 
    users as u 
    inner join (
    select b.* 
    from 
     belts as b 
     inner join (
      select max(id) as maxId from belts group by userId 
     ) as a on b.id = a.maxId 
    ) as b on u.userId = b.userId 
where 
    b.belt_colour = 'brown' 

希望這有助於