【问题标题】:Using aliases in SQL inner join在 SQL 内连接中使用别名
【发布时间】:2014-08-28 00:08:19
【问题描述】:

我查看了一些使用联接获取组中最高值的示例,但我尝试过的方法不喜欢在内部联接之外使用别名。

SELECT f.year, f.name, f.date_start, f.date_end, f.max_year FROM ( SELECT EXTRACT(year FROM date_start) AS year, MAX(DATEDIFF(date_end,date_start)) AS max_year FROM mytable GROUP BY year ) AS x inner join mytable AS f on f.year = x.year and f.max_year = x.max_year;

如果我有一张桌子:

Name date_start date_end John 1950-04-05 1960-07-08 Jack 1950-04-06 1960-12-31 Mark 1954-01-01 1970-01-01 Jane 1954-10-10 1978-10-01

然后我希望它为 start_date 的每一年显示两个日期之间差距最大的条目:

Year Name date_start date_end max_year 1950 Jack 1950-04-06 1960-12-31 3922 1954 Jane 1954-10-10 1978-10-01 8758

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 您在运行查询时是否遇到错误或结果与预期不符?

标签: mysql sql


【解决方案1】:

看起来您在 SELECT 列表中使用了错误的别名,这样应该会更好:

SELECT x.year, f.name, f.date_start, f.date_end, x.max_year FROM
(
    SELECT 
      EXTRACT(year FROM date_start) AS year, 
      MAX(DATEDIFF(date_end,date_start)) AS max_year
    FROM mytable GROUP BY year
)  AS x inner join
mytable AS f on  EXTRACT(year FROM f.date_start) = x.year 
AND DATEDIFF(f.date_end, f.date_start) = x.max_year;

但是,我会这样做:

SELECT name, date_start, date_end
FROM mytable f
WHERE NOT EXISTS (
  SELECT * FROM mytable 
  WHERE  
    EXTRACT(year FROM date_start) = EXTRACT(year FROM f.date_start) AND
    DATEDIFF(date_end, date_start) > DATEDIFF(f.date_end, f.date_start)
)

【讨论】:

  • 感谢@Bulat,两者都工作得很好!我现在知道我的别名哪里出了问题。我对使用联接很陌生,所以感谢您的帮助!
【解决方案2】:

你可以试试这个:

SELECT * FROM
(
  SELECT *, EXTRACT(year FROM date_start) AS year, DATEDIFF(date_end,date_start) AS diff
  FROM mytable
  ORDER BY diff DESC
) sq
GROUP BY year
ORDER BY year ASC

小提琴演示:http://sqlfiddle.com/#!2/4d0da/11

【讨论】:

  • +1 用于工作解决方案,但它是 mysql hack,所以我不建议使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
相关资源
最近更新 更多