2016-04-17 42 views
0

多行选择一个行我对这个问题1个相关的表,奖励:基于一个场

---------------------------------------- 
| award        | 
---------------------------------------- 
| id | name | URL | country_id | point | 
---------------------------------------- 
    1 | A | a | 1   | 120 
    2 | A | b | 0   | 60 
    3 | A | b | 2   | 80 
    4 | B | c | 0   | 50 
    5 | B | d | 1   | 70 

我希望能够获得特定国家,相应的各类奖项的名单(同一奖项具有相同的名称),其列为point列的最高值。

因此,我尝试通过点DESC命令我的请求,并按名称分组,但它没有做到这一点,我没有得到正确的点数和正确的URL。

我知道我可以通过从表中获取所有数据然后只保留具有最佳点数的行,但必须有一种方法可以仅使用SQL来完成此操作!

我尝试的要求是:

SELECT name, URL, point FROM award WHERE country_id IN (0,1) ORDER BY point DESC GROUP BY name 

回答

0

这应该得到你在找什么:

SELECT t1.* FROM award AS t1 
    INNER JOIN (SELECT name, MAX(point) AS point 
     FROM award 
     WHERE country_id IN (0,1) 
     GROUP BY name) AS t2 
    ON t1.name=t2.name 
     AND t1.point=t2.point; 

这里是如何分解:

这是加入award表(标识为t1),子查询标识为t2。子查询如下所示:

SELECT name, MAX(point) AS point 
    FROM award 
    WHERE country_id IN (0,1) 
    GROUP BY name 

子查询将返回每个名称的最大点数。下面是子查询的结果:

+------+-------+ 
| name | point | 
+------+-------+ 
| A | 120 | 
| B | 70 | 
+------+-------+ 

显然,这并不包括URL。如果确实如此,那么URL必须位于GROUP BY之后,那么您的输入将是nameURL的唯一组合(然后您将无法获得最大分值)。

下一步是基本加入到这个临时表中,以获得匹配的award表中的行。

INNER JOIN (...) AS t2 
    ON t1.name=t2.name 
     AND t1.point=t2.point; 

的加盟认定在award表中的行,其中的子查询的结果namepoint匹配namepoint。这给了我们所需的完整行 - 我们现在可以访问URL。结果是这样的:

+------+------+------+------------+-------+ 
| id | name | URL | country_id | point | 
+------+------+------+------------+-------+ 
| 1 | A | a |   1 | 120 | 
| 5 | B | d |   1 | 70 | 
+------+------+------+------------+-------+ 

此外,在这一点上,你可以通过列在你想要的award表的顺序,例如名称:

ORDER BY t1.name 

或最高点值:

ORDER BY t1.point DESC 
+0

它为我工作,但也有可能是,如果有使用相同的名称和相同数量的点不同的行了一个问题:URL可能是错误的(不是从良行)。 – hellimac

+0

你想在这种情况下返回哪一行(即哪一行是“好行”)?如果您将country_id包含在group中并加入,那么您将获得每个国家/地区的最大分数。不知道这是你在找什么。 – markwatsonatx

0

如果你想点递减,尝试

SELECT name, country_id, point 
FROM `award` 
WHERE country_id IN (0,1) 
GROUP BY name, country_id 
ORDER BY name, point DESC 

结果

name |country_id |point 
    =====|============|=========== 
    A |1   |120 
    A |0   |60 
    B |1   |70 
    B |0   |50 
+0

我想我的问题还不够清楚。这里的目标是每个名称只有一行,即具有最高价值的一行。 – hellimac