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