0

これらの 2 つの MySQL テーブルがあります。

DESCRIBE time;
+---------------+-------------------------------------+------+-----+---------+----------------+
| Field         | Type                                | Null | Key | Default | Extra          |
+---------------+-------------------------------------+------+-----+---------+----------------+
| id            | int(11)                             | NO   | PRI | NULL    | auto_increment |
| date          | date                                | NO   |     | NULL    |                |
+---------------+-------------------------------------+------+-----+---------+----------------+

DESCRIBE employee;
+---------+--------------------------------------+------+-----+---------+----------------+
| Field   | Type                                 | Null | Key | Default | Extra          |
+---------+--------------------------------------+------+-----+---------+----------------+
| id      | int(11)                              | NO   | PRI | NULL    | auto_increment |
| tid     | int(11)                              | NO   | MUL | NULL    |                |
| salary  | double                               | NO   |     | NULL    |                |
| age     | int(11)                              | NO   |     | NULL    |                |
+---------+--------------------------------------+------+-----+---------+----------------+

以下のクエリでは、[給与 | 日付] テーブル。日付が変わると、行番号は 1 にリセットされます。これが私のクエリです:

SELECT IF(@prev != d.date, @rownum := 1, @rownum := @rownum + 1) AS row, @prev := d.date, e.salary
FROM employee e, time d, (SELECT @rownum := 0, @prev := NULL) r
WHERE e.age >= 18 AND e.age <= 25 AND e.tid = d.id AND d.date >= '2002-01-01' AND d.date <= '2003-01-01'
ORDER BY date, salary;

以下の最初の表に示すような結果が得られました。行番号が正しくありません。予想される行番号は、下の 2 番目の表に示されています。

+------+-----------------+---------+
| row  | @prev := d.date | salary  |
+------+-----------------+---------+
|    6 | 2002-01-01      | 21823.2 |
|    2 | 2002-01-01      |   27279 |
|    9 | 2002-01-01      |   35073 |
|    8 | 2002-01-01      | 36631.8 |
|    4 | 2002-01-01      | 36631.8 |
|    7 | 2002-01-01      |   38970 |
|    5 | 2002-01-01      | 52219.8 |
|    3 | 2002-01-01      |  350730 |
|    1 | 2002-01-01      |  389700 |
|    7 | 2003-01-01      | 21823.2 |
|    2 | 2003-01-01      |   27279 |
|    4 | 2003-01-01      | 31565.7 |
|   10 | 2003-01-01      |   35073 |
|    3 | 2003-01-01      | 36242.1 |
|    9 | 2003-01-01      | 36631.8 |
|    5 | 2003-01-01      | 36631.8 |
|    8 | 2003-01-01      |   38970 |
|    6 | 2003-01-01      | 52219.8 |
|    1 | 2003-01-01      |  389700 |
+------+-----------------+---------+

正しい行番号で次の結果が期待されました。考え?

+------+-----------------+---------+
| row  | @prev := d.date | salary  |
+------+-----------------+---------+
|    1 | 2002-01-01      | 21823.2 |
|    2 | 2002-01-01      |   27279 |
|    3 | 2002-01-01      |   35073 |
|    4 | 2002-01-01      | 36631.8 |
|    5 | 2002-01-01      | 36631.8 |
|    6 | 2002-01-01      |   38970 |
|    7 | 2002-01-01      | 52219.8 |
|    8 | 2002-01-01      |  350730 |
|    9 | 2002-01-01      |  389700 |
|    1 | 2003-01-01      | 21823.2 |
|    2 | 2003-01-01      |   27279 |
|    3 | 2003-01-01      | 31565.7 |
|    4 | 2003-01-01      |   35073 |
|    5 | 2003-01-01      | 36242.1 |
|    6 | 2003-01-01      | 36631.8 |
|    7 | 2003-01-01      | 36631.8 |
|    8 | 2003-01-01      |   38970 |
|    9 | 2003-01-01      | 52219.8 |
|   10 | 2003-01-01      |  389700 |
+------+-----------------+---------+
4

2 に答える 2

1
SELECT IF(@prev != date, @rownum := 1, @rownum := @rownum + 1) AS row, 
       @prev := date, salary
  FROM  (SELECT d.date,e.salary
           FROM employee e, time d
          WHERE e.age >= 18 
            AND e.age <= 25 
            AND e.tid = d.id 
            AND d.date >= '2002-01-01' 
            AND d.date <= '2003-01-01'
       ORDER BY date, salary) a, (SELECT @rownum := 0, @prev := NULL) r;
于 2013-07-07T02:29:05.603 に答える
0

結果セットをインライン ビュー (派生テーブル) で並べ替えてみてください。外側のクエリでインライン ビューを参照して、rownum を割り当てます。

SELECT IF(@prev != t.date, @rownum := 1, @rownum := @rownum + 1) AS `row`
     , @prev := t.date  AS `date`
     , t.salary
  FROM (SELECT @rownum := 0, @prev := NULL) r
 CROSS
  JOIN (   
         SELECT d.date
              , e.salary
           FROM employee e
           JOIN time d 
             ON d.tid = e.tid
          WHERE e.age >=8
            AND e.age <= 25
            AND d.date >= '2002-01-01'
            AND d.date <= '2003-01-01'
          ORDER 
             BY d.date
              , e.salary
       ) t
 ORDER
    BY t.date
     , e.salary

テストのために、インライン ビューでクエリのみを実行できます (t個別にエイリアス化され、結果セットが希望どおりに並べられていることを確認します。

于 2013-07-07T02:28:40.747 に答える