2017-10-05 6 views
1

私は次のような構造を持つテーブルがあります。私は今年のエントリを使用する「差分」列を作成したいと思いますMySqlを使用したクエリから作成されたテーブルに2つのエイリアスを付けるにはどうすればよいですか?

year 
---------- 
1995 
2000 
2010 

*(最初の3行)

ind | year | diff 
----------------- 
    1 | 1995 | 0 
    2 | 2000 | 5 
    3 | 2010 | 10 

これを行うには、私は列を作成して、ここに示唆された修正を試みました:http://www.mysqltutorial.org/mysql-tips/mysql-compare-calculate-difference-successive-rows/

私は成功しませんでしたw i番目の私が作成したテーブルに2番目の別名を与える:

SET @row_number = 0; 

SELECT 
     g1.ind 
    (g2.year - g1.year) AS diff 
FROM (
     select * from 
         (SELECT 
          (@row_number:[email protected]_number + 1) AS ind, year 
         FROM 
          movies) t 

) g1 
INNER JOIN 
g1 g2 ON g2.ind = g1.ind + 1 

エラーは、次のとおりです。 エラーコード:1146テーブル「db_name.g1は」私がもしわからない

+0

Idsが常に連続していますか? – Strawberry

+0

私は自分の質問を再編集しました。実際にはないので、連続ID列を作成しましたが、今作成したテーブルにエイリアスを付けることに問題があります。 – Bugu

+0

diff列とind列を作成しますか? – Strawberry

答えて

0
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(year INT NOT NULL PRIMARY KEY); 

INSERT my_table VALUES 
(1995),(2000),(2010); 

例えば

SELECT x.year 
    , x.year - COALESCE(MAX(y.year),x.year) diff 
    FROM my_table x 
    LEFT 
    JOIN my_table y 
    ON y.year < x.year 
GROUP 
    BY x.year; 
+------+------+ 
| year | diff | 
+------+------+ 
| 1995 | 0 | 
| 2000 | 5 | 
| 2010 | 10 | 
+------+------+ 
3 rows in set (0.01 sec) 

を...か...

SELECT year 
    , COALESCE([email protected],0) diff 
    , @prev:=year 
    FROM my_table 
    , (SELECT @prev:=null) vars 
ORDER 
    BY year; 
+------+------+-------------+ 
| year | diff | @prev:=year | 
+------+------+-------------+ 
| 1995 | 0 |  1995 | 
| 2000 | 5 |  2000 | 
| 2010 | 10 |  2010 | 
+------+------+-------------+ 
0

存在しません。あなたは物事を少し複雑にしました。

これを試してみてください:

idが存在しない場合は

|id|year|diff| 
+--+----+----+ 
|1 |1995| 0 | 
|2 |2000| 5 | 
|3 |2010| 10 | 

(あなたのデータを使用して)出力、および、我々だけでm2.yearをラップに生成する必要はありません

SELECT 
    m1.id, 
    m1.year, 
    IFNULL(m1.year - m2.year, 0) AS diff 
FROM 
    movies m1 
LEFT JOIN 
    movies m2 ON m2.id +1 = m1.id 
ORDER BY id ASC 

差分フィールドにmax

SELECT 
    m1.year, 
    IFNULL((m1.year - max(m2.year)),0) AS diff 
FROM movies m1 
LEFT JOIN 
    movies m2 on m1.year > m2.year 
GROUP BY m1.year 

...年。これが与える:。:

|year|diff| 
+----+----+ 
|1995| 0 | 
|2000| 5 | 
|2010| 10 | 
+0

ありがとう!私は私が扱っている問題をよりよく説明するために私の質問を編集しました。あなたは、ムービーテーブルの代わりに、選択クエリの結果であるテーブルを使用する必要がある場合のソリューションを提案できますか?この場合エイリアスを与えることに問題があります – Bugu

関連する問題