繁体   English   中英

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

[英]PHP/MySQL - Need assistance writing a SQL Query

我有一个武术网站,在一张桌子上有用户,而在另一张桌子上有用户。 以下是一些示例表/数据来帮助描述我的问题:

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

我的问题是:当您单击棕色时,要查看所有棕色皮带,我希望您看到弗雷德。 我不希望Fred出现在蓝色和紫色皮带的列表中(此刻正在发生这种情况)。

我正在努力提出这样的查询:

向我显示所有用户,其中belt = $ belt,但前提是他们没有更高皮带的条目。

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

任何协助,不胜感激!

假设更高的皮带意味着更高的dashed_date,一个选择是获取每个用户的maxed_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'

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

因为每个腰带都被一个接一个地授予,所以您要展示最近的那个。 因此,您的查询将如下所示:

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

希望这可以帮助。

让我们将这个问题一分为二:

  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'

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM