mysql多订单故障自连接来自同一表
我先用句子的形式来表达,然后用数据的形式 我想在以下句子中做什么: “让我看看三家汽车制造商,他们按最新发布的汽车分类, 以及这些制造商生产的所有汽车。” 所以我希望数据能像这样出来:mysql多订单故障自连接来自同一表,mysql,sql-order-by,self-join,Mysql,Sql Order By,Self Join,我先用句子的形式来表达,然后用数据的形式 我想在以下句子中做什么: “让我看看三家汽车制造商,他们按最新发布的汽车分类, 以及这些制造商生产的所有汽车。” 所以我希望数据能像这样出来: Ford, ModelA, 2012 Ford, ModelG, 2008 Toyota, ModelH, 2011 Toyota, ModelJ, 2009 Honda, ModelN, 2010 Hondda, ModelK, 2007 我的问题是,当我试图按制造商一起订购时,它会按发布日期取消订购 For
Ford, ModelA, 2012
Ford, ModelG, 2008
Toyota, ModelH, 2011
Toyota, ModelJ, 2009
Honda, ModelN, 2010
Hondda, ModelK, 2007
我的问题是,当我试图按制造商一起订购时,它会按发布日期取消订购
Ford, ModelA, 2012
Ford, ModelG, 2008
Honda, ModelN, 2010 <--wrong, Toyota should go here
Hondda, ModelK, 2007
Toyota, ModelH, 2011
Toyota, ModelJ, 2009
(由于无法在所有类型的子查询上使用该限制,因此某些其他模式不足)
我愿意把它分成多个查询
+---------------+---------+--------+
|manufacturer | model | year |
|---------------|---------|--------|
|ford |modelA |2008 |
|toyota | modelS |2010 |
编辑:
kordirko的答案和我的一些变体,以正确的顺序返回制造商,但年份被子查询匹配覆盖。所以它产生了类似于
Ford, ModelA, 2012
Ford, ModelG, 2012<--
Honda, ModelN, 2010
Hondda, ModelK, 2010<--
Toyota, ModelH, 2011
Toyota, ModelJ, 2011<-- wrong, need it to show actual year of model, not year from match of the most recent
还没有经过严格的测试,但在粗略测试中似乎有效。试试:
SELECT c.manufactuer,
c.model,
c.year,
s.year As most_recent_year
FROM cars c
INNER JOIN (
SELECT m.manufactuer, max(m.year) year
FROM cars AS m
GROUP BY m.manufactuer
ORDER BY year DESC LIMIT 3
) s
ON c.manufactuer=s.manufactuer
ORDER BY s.year DESC, c.year DESC
演示:尝试
按subq.year DESC订购,cars.year DESC
@kordiko-Close。它按发布日期正确订购,并按制造商正确分组,但内部联接将所有年份值替换为子查询中匹配的年份值。这非常接近。它按发布日期正确订购,并按制造商正确分组,但内部联接将所有年份值替换为子查询中匹配的年份值。查询使用的是SELECT*
,而不是明确列出所需的列名,这就是为什么一个年份栏被另一个同名栏所取代的原因。通常不建议在查询中使用SELECT*
。我已经更正了答案中的问题,并添加了一个指向simple demo.Awesome demo的链接。谢谢
Ford, ModelA, 2012
Ford, ModelG, 2012<--
Honda, ModelN, 2010
Hondda, ModelK, 2010<--
Toyota, ModelH, 2011
Toyota, ModelJ, 2011<-- wrong, need it to show actual year of model, not year from match of the most recent
SELECT cars.manufacturer, cars.year FROM cars
RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq
ON cars.manufacturer=subq.manufacturer
SELECT c.manufactuer,
c.model,
c.year,
s.year As most_recent_year
FROM cars c
INNER JOIN (
SELECT m.manufactuer, max(m.year) year
FROM cars AS m
GROUP BY m.manufactuer
ORDER BY year DESC LIMIT 3
) s
ON c.manufactuer=s.manufactuer
ORDER BY s.year DESC, c.year DESC