2013-07-07 3 views
0

J'ai ces 2 tables MySQL:MySQL variable de ligne de commande

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 |    | 
+---------+--------------------------------------+------+-----+---------+----------------+ 

Dans la requête ci-dessous, je tente de joindre le numéro de ligne pour mon salaire [| date] table. Le numéro de ligne est réinitialisé à 1 à mesure que la date change. Voici ma requête:

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; 

J'ai obtenu les résultats comme indiqué dans le premier tableau ci-dessous. Les numéros de ligne sont incorrects. Les numéros de ligne attendus sont indiqués dans le deuxième tableau ci-dessous.

+------+-----------------+---------+ 
| 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 | 
+------+-----------------+---------+ 

Je m'attendais aux résultats suivants avec des numéros de ligne corrects. Pensées?

+------+-----------------+---------+ 
| 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 | 
+------+-----------------+---------+ 

Répondre

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; 
+0

Merci, cela donne les résultats comme prévu. –

0

Essayez de classer les résultats dans une vue en ligne (table dérivée). Référence à la vue en ligne dans une requête externe, pour attribuer le 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 

Pour les tests, vous pouvez simplement exécuter la requête dans la vue en ligne (crénelage comme t séparément, pour vérifier que le resultset est ordonné la façon dont vous le vouloir

Questions connexes