[mysq-4.1-alfa] dom subquerie probleem of bug?

Pagina: 1
Acties:

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
Ik heb een tabel met daar een verzamelijk met users, die user kunnen op een datum dps opsturen. Ik wil in 1 querie hebben die mij een overzicht van de totale score, dwz alle dps per user optellen als het aantal dps van gisteren ophalen uit de database.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
SELECT
    t1.name as Name,
    Overall.Total as 'Overall',
    Yesterday.Total as 'Yesterday'
FROM
    ECC2_USERS t1

left Outer join
 
-- subquerie voor overall score

(Select
    id_user as 'user',
    SUM(t2.dps) as 'Total'
From
    ECC2_USERFLUSH t2
Group By
t2.user
) as Overall on t1.id = Overall.User
 

-- subquerie voor daily score

left Outer Join
(Select
    id_user as 'user',
    SUM(t3.dps) as 'Total'
From
    ECC2_USERFLUSH t3
Where
    t3.date = subdate(current_date, interval 1 day)
Group By
t3.user
) as Yesterday on t1.id = Yesterday.User
Order By 'Overall' DESC, 'Yesterday'DESC


De reden waarom ik misschien denk dat het een bug is is omdat die 2 subqueries heel veel op elkaar lijken, en als ik die where statement uit de 2e subquerie sloot zijn beide subqueries gelijk (muv t2 > t3). Ik verwacht dat dan ik 2 keer hetzelfde rijtje scores moet krijgen. Maar dat krijg ik niet :( De 2e subquerie is veel groter dan de eerste (eerste is totaal en 2e is dagscore) dus dat klopt voor geen kant.

Maar laten we de hoop niet opgeven, misschien ligt het toch gewoon aan mij.

...


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik snap erg weinig van je uitleg en zie al helemaal niet in wat er fout zou moeten zijn zolang jij geen uitleg geeft wat je wilt bereiken en wat er komt :)

Ow, er zal trouwens wel geen 't3.user' zijn of wel :?

[ Voor 42% gewijzigd door ACM op 14-05-2003 19:12 ]


  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
Goed, dan zal ik het iets duidelijk proberen uit te leggen.

Ik heb 2 tables in een database: ECC2_USERFLUSH en ECC2_USERS. In ECC2_USERS staan namen gekoppeld aan id's. In ECC2_USERFLUSH staan id_users's, datums en dps.

ECC2_USERS:
code:
1
2
3
4
5
6
+----+---------------+
| id | name          |
+----+---------------+
|  1 | Haranaka      |
|  2 | Huize SjeePee |
+----+---------------+
ECC2_USERFLUSH:
code:
1
2
3
4
5
6
7
8
+---------+------------+-----+
| id_user | date       | dps |
+---------+------------+-----+
|       2 | 2003-05-12 |  42 |
|       1 | 2003-05-12 |  62 |
|       1 | 2003-05-13 |  36 |
|       1 | 2003-02-03 |  94 |
+---------+------------+-----+


Voeger gebruikte ik 2 aparte queries om het totaal van de users uit te rekenen en een aparte querie om de score van een bepaalde dag (gisteren) uit te rekenen.
Wat ik wil is die 2 queries samenvoegen:

Overall:
code:
1
2
3
4
5
6
7
8
SELECT
    name,
    sum(dps)
FROM
    ECC2_USERS
left Outer join
    ECC2_USERFLUSH ON id = id_user
Group by id
Dat levert op:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
+---------------+----------+
| name          | sum(dps) |
+---------------+----------+
| Haranaka      |    14306 |
| Huize SjeePee |     8543 |
| Jack Flushell |     6499 |
| Stijn         |     4234 |
| mata          |     2543 |
| zZ            |        5 |
| Jan Aart      |       35 |
| Soldaat       |     1354 |
+---------------+----------+
8 rows in set (0.43 sec)

Dan de querie voor de score van een bepaalde dag:
code:
1
2
3
4
5
6
7
8
9
SELECT
    name,
    dps
FROM
    ECC2_USERS
left Outer join
    ECC2_USERFLUSH ON id = id_user
where
    date="2003-05-01";
Dat levert op:
code:
1
2
3
4
5
6
7
8
9
10
+---------------+------+
| name          | dps  |
+---------------+------+
| Haranaka      |   56 |
| Huize SjeePee |   80 |
| Jack Flushell |   68 |
| Stijn         |   18 |
| mata          |   38 |
+---------------+------+
5 rows in set (0.01 sec)


Wat ik dus wil is deze 2 queries samenvoegen tot 1 querie. Zodat er zoiets uitkomt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
+---------------+---------+-----------+
| Name          | Overall | Yesterday |
+---------------+---------+-----------+
| Haranaka      |   14306 |        62 |
| Huize SjeePee |    8543 |        53 |
| Jack Flushell |    6499 |        99 |
| Stijn         |    4234 |      NULL |
| mata          |    2543 |      NULL |
| Soldaat       |    1354 |         3 |
| Jan Aart      |      35 |      NULL |
| zZ            |       5 |      NULL |
+---------------+---------+-----------+

En dat krijg ik dus niet voor elkaar.

...


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En wat is de output van je bovenstaande query?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

In postgresql (heb geen mysql-4.1 om het te testen) werkt deze query iig goed:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
SELECT
    t1.name as Name,
    Overall.Total as Overall,
    Yesterday.Total as Yesterday
FROM
    ECC2_USERS t1
    left Outer join

-- subquerie voor overall score
    (Select
        id_user as userid,
        SUM(t2.dps) as Total
    From
        ECC2_USERFLUSH t2
    Group By
        userid
    ) as Overall on t1.id = Overall.Userid

-- subquerie voor daily score
    left Outer Join
    (Select
        id_user as userid,
        SUM(t3.dps) as Total
    From
        ECC2_USERFLUSH t3
    Where
        t3.datum = '2003-05-13'
    Group By
        userid
    ) as Yesterday on t1.id = Yesterday.Userid
    Order By Overall DESC, Yesterday DESC

Het kan goed zijn dat mysql die id_user as 'user' enzo niet zo leuk vind (die ') dat is iig officieel fout.

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
De querie in mijn openings post ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
+---------------+---------+-----------+
| Name          | Overall | Yesterday |
+---------------+---------+-----------+
| Haranaka      |   14347 |       236 |
| Huize SjeePee |    8543 |       236 |
| Jack Flushell |    6499 |       236 |
| Stijn         |    4234 |       236 |
| mata          |    2543 |       236 |
| Soldaat       |    1354 |       236 |
| Jan Aart      |      35 |       236 |
| zZ            |       5 |       236 |
+---------------+---------+-----------+
8 rows in set (0.02 sec)


De overall score klopt gewoon, maar die yesterday score klopt voor geen kant. Die zou moeten zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
+---------------+------+
| name          | dps  |
+---------------+------+
| Haranaka      |  138 |
| Huize SjeePee |  106 |
| Jack Flushell |   66 |
| Stijn         |   52 |
| mata          |    8 |
| zZ            |    0 |
| Jan Aart      |    9 |
| Soldaat       |   12 |
+---------------+------+
8 rows in set (0.31 sec)


Waar dat getal 236 vandaan komt heb ik wel een idee, er is in de database slechts 2 entry's van 236 dps op een dag, op 01-01 en 02-02, beide gedaan door id_user 4 (Stijn) .
Maar als ik een select * from ecc2_userflush doe dan staat als laatste entry in de database:
code:
1
2
3
|       4 | 2003-01-01 |  236 |
+---------+------------+------+
533 rows in set (0.01 sec)


Dus ik denk dat hij daar die 236 vandaan komt.

-edit-
ACM schreef op 15 mei 2003 @ 15:15:
Het kan goed zijn dat mysql die id_user as 'user' enzo niet zo leuk vind (die ') dat is iig officieel fout.
Ik heb alle ' tekens weggehaald, en zelfs alle "as user" enz (behalve de aliases voor de subqueries), maar ik krijg nog steeds 8 keer die 236 op mijn bord.

[ Voor 12% gewijzigd door Haranaka op 15-05-2003 15:44 ]

...


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

En met de query die ik postte? Die is ietsje anders dan wat jij had staan.

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 07-06 23:13
dan krijg ik weer die 236 voorgeschoteld voor iedere user. het maakt ook niet uit welke datum ik gebruik in die where clause er komt altijd 236 uit...

Hopelijk ziet iemand nog licht in deze tunnel want ik zie het niet ;(

...

Pagina: 1