SQL查询创建

时间:2015-06-15 20:19:43

标签: mysql sql

我必须在不使用显示拥有单一所有者的最大汽车数量的汽车品牌的视图的情况下进行查询。

那是我的表

CAR(idcar, brand, name, year_p)
OWNER(idowner,name, b_date)
PROPERTY(idcar,idowner,date_b, date_s)

这就是我写的......

SELECT Car.brand, COUNT(PROPERTY.idowner) as con
FROM PROPERTY JOIN CAR ON Car.idcar=Property.idcar
GROUP BY Car.brand
ORDER BY con ASC
LIMIT 1;

没关系?我能做些什么来改善它?

它应该如何运作

       CAR
-----------------
1|FIAT|test1|2000
2|Alfa|test2|2011
3|FIAT|test3|2001
4|Alfa|test4|2006
5|Alfa|test5|2004

   OWNER
-----------
1|John|1990
2|Jack|1980
3|Sam |1991
4|Rick|1980
5|Cris|1993
6|Holm|1992


  PROPERTY
-------------
1|1|2000|2000
2|1|2001|2003
3|2|2000|2004
1|3|2002|2005
4|4|2004|2006
5|6|2003|2008
2|5|2001|2009

所以查询应该返回Alfa,因为我有3个人只有一辆车而这3个人有一个alfa(所以3 alfa)。它不能成为菲亚特,因为我只有2个人,只有一辆车是菲亚特(所以2菲亚特)。 OWNER n1被排除在外,因为他有2辆车

3 个答案:

答案 0 :(得分:1)

我认为你的查询是在正确的道路上,只需要稍加修改......

首先,如果您想要选择拥有最多所有者的品牌,那么您应该按降序排序,以便最大值位于顶部...第二,您需要添加WHERE子句,这将排除所有拥有多于一个的所有者车...

它应该是这样的:

SELECT c.brand, COUNT(p.idowner) as con
FROM PROPERTY p
JOIN CAR c
ON c.idcar=p.idcar
WHERE p.idowner NOT IN (SELECT idowner
                        FROM (SELECT idowner, COUNT(idowner) as c
                              FROM PROPERTY
                              GROUP BY idowner) x
                        WHERE c > 1)
GROUP BY c.brand
ORDER BY con DESC
LIMIT 1;

以下SQL Fiddle来了解它是如何工作的......

GL!

答案 1 :(得分:0)

评论太长了。

您的查询不正确。它返回了汽车性能最高的品牌。这可能与业主的数量有关,也可能与此无关。我确信有某种关系(“没有属性” - >“没有所有者”,反之亦然)。

无论如何,我不知道“拥有一个拥有者的最大车辆数量”是什么意思。您应该使用示例数据和所需结果编辑您的问题。 SQL小提琴也很有帮助。

答案 2 :(得分:0)

--CTE to Get single owner
WITH CTEsingleowner(ct, idowner) 
     AS (SELECT Count(1) AS ct, 
                idowner 
         FROM   property  WITH(nolock) 
         GROUP  BY idowner 
         HAVING Count(1) = 1) 


-- Select brand with maximum number of single owner
-- with ties is used to resolve confilict  more than one record set returned 

SELECT TOP (1) WITH ties Count(1) AS cnt, 
                         brand 
FROM   CTEsingleowner ct 
       JOIN property p WITH(nolock) 
         ON p.idowner = ct.idowner 
       JOIN car c WITH(nolock) 
         ON ( c.idcar = p.idcar ) 
GROUP  BY brand 
ORDER  BY cnt DESC ;

- 获得单一所有者的CTE

WITH CTEsingleowner(ct,idowner) AS(SELECT Count(1)AS ct,idowner FROM属性WITH(nolock) GROUP BY idowner 有计数(1)= 1)

- 选择具有最大单个所有者数量的品牌 - 使用tie来解决多个行返回的冲突

SELECT TOP(1)WITH ties Count(1)AS cnt,brand 来自CTEsingleowner ct JOIN属性p WITH(nolock) ON p.idowner = ct.idowner 加入汽车c WITH(nolock) ON(c.idcar = p.idcar) GROUP BY品牌 订购cnt DESC;