2011-05-25 75 views
0

我得来问这个问题,因为我已经生气,哭了,所有的事情,因为这真的杀了我。我讨厌SQL。但它必须完成。网站使用SQL。用其他数据获得最大值

我有这些表(缩短至necessessary,而不是真正的SQL):

CREATE TABLE deliverer(d_id INT PRIMARY KEY, name VARCHAR(80)); 
CREATE TABLE article(a_id INT PRIMATY KEY, brand VARCHAR(80)); 
CREATE TABLE delivers(d_id FOREIGN KEY(deliverer), a_id FOREIGN KEY(article)); 

我需要为每个brand那些deliverers,可提供最多的文章。我来至于此,只有两个小时的心灵扭曲后:

SELECT brand, MAX(cnt) 
FROM 
(SELECT COUNT(a.a_id) AS cnt, a.brand, d.d_id, d.name 
    FROM derliverer d, delivers l, article a 
    WHERE a.a_id = l.a_id AND l.d_id = d.d_id 
    GROUP BY a.brand, d.d_id, d.name) 
GROUP BY brand; 

我真的,真的,真的不明白有关SQL就是为什么它不会让我GROUP BY brandSELECTd.name, d.d_id。这真的没有意义。

在我跳出窗前请帮助我。

+0

您正在使用什么RDBMS? – 2011-05-25 19:25:28

+0

我认为这是DB2在生产中,不确定。在测试中使用MySQL。 – Lanbo 2011-05-25 19:27:49

回答

0

我真的,真的,真的没有得到关于SQL的原因是它为什么不让我GROUP BY品牌和SELECT d.name,d.d_id。这真的没有意义。

因为如果你这样做,计数将针对每个不同的d.name,d.d_id。这不是你想要的。

你一定想读一些tutorials关于如何工作的一组。

我需要为每个品牌提供最多文章的送货员。

在这种情况下,你需要这样的东西:

select brand_id, count(*) as top_deliverer, deliverer_id, deliverer.etc. 
from some stuff 
group by brand_id, deliverer_id, deliverere.etc 
order by top_deliverer desc 
+0

Wel,它是有效的,但它不会给我所需的额外数据。我需要对品牌进行分组,但是也可以通过它获得d.name,而不用分组。但是'max'功能迫使我按每一列进行分组。 – Lanbo 2011-05-25 19:38:30

+0

与原始表一起加入...或使用两个单独的查询(可能会更好)。 – 2011-05-25 19:40:07

+0

后续行动:我相应地更新了我的答案。根据你的回答,你肯定需要通过陈述来阅读该组,因为你完全被它所做的事所困惑。您需要*在大多数数据库中按其他列进行分组,并且如果您最终认为使用子查询的“编码”优化将导致全表扫描(这远远不是最佳)。 – 2011-05-25 19:46:52