PHP / MySQL - 编写SQL查询需要帮助

时间:2013-05-27 15:54:59

标签: php mysql greatest-n-per-group

我有一个武术网站,我有一个桌子上的用户和他们在另一个表中获得的腰带。以下是一些示例表/数据,以帮助描述我的问题:

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  |
+------------------------------------------+

我的问题是:当你点击棕色时,要查看所有棕色腰带,我希望你看到弗雷德。我不希望弗雷德出现在蓝色和紫色腰带的列表中(这是目前正在发生的事情)。

我正在努力想出一个像这样的查询:

  

告诉我所有使用腰带= $腰带的用户,但前提是他们没有更高腰带的条目。

另一个例子:我是紫色但我出现在蓝色列表中,因为我的蓝带的细节也在腰带表中: - (

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:3)

假设更高的腰带意味着更高的award_date,一个选项是获得每个用户的MAX award_date并加入腰带表:

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 :(得分:1)

按_awarded_date_降序排序。 将1 限制为结果。

由于每个腰带都是一个接一个地颁发,最近的,是你要展示的。所以,你的查询将是这样的:

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

希望这有帮助。

答案 2 :(得分:0)

让我们将这个问题分成两部分:

  1. 首先,您需要为每个人展示最新的皮带
  2. 然后你需要向有腰带的人展示
  3. 所以,让我们开始。

    步骤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'
    

    希望这有帮助