[MySQL] bij dubbel selecteren op extra veld

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rogierslag
  • Registratie: Maart 2005
  • Laatst online: 14-10-2024
ik heb momenteel de volgende (voorbeeld) dataset die van toepassing is

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ID  inlogID datum   aanwezig    sterk   happen  overruled   ID  oldID   newID   editor  uitleg  time
4154     1  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4196     2  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4161     3  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4147     4  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4133     5  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4217     6  2009-08-17  1   0   0   1   795 4217    4217    0   geforceerde invoer  2009-08-24 00:01:03
4105     7  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4119     8  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4140     9  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4203    10  2009-08-17  1   0   0   1   781 4203    4203    0   geforceerde invoer  2009-08-24 00:01:03
4203    10  2009-08-17  1   0   0   1   808 4203    4230    1   fout bij invullen   2009-08-24 13:05:41
4203    10  2009-08-17  1   0   0   1   827 4203    4269    1   fout bij invullen   2009-08-24 20:02:47
4203    10  2009-08-17  1   0   0   1   828 4203    4270    1   fout bij invullen   2009-08-24 20:17:14
4270    10  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4210    11  2009-08-17  1   0   0   1   788 4210    4210    0   geforceerde invoer  2009-08-24 00:01:03
4224    12  2009-08-17  1   0   0   1   802 4224    4224    0   geforceerde invoer  2009-08-24 00:01:03
4112    13  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4126    14  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4189    15  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4236    16  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4182    17  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL


nou krijg ik hier met de Query
code:
1
2
3
4
5
6
7
8
9
10
SELECT * 
FROM `beer_attendance` 
LEFT JOIN beer_attendance_history bah ON beer_attendance.ID = bah.oldID
WHERE datum = '2009-08-17'
AND (
bah.ID IS NULL 
OR bah.oldID = bah.newID
)
ORDER BY inlogID
LIMIT 0 , 30
de volgende output uit.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ID  inlogID datum   aanwezig    sterk   happen  overruled   ID  oldID   newID   editor  uitleg  time
4154     1  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4196     2  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4161     3  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4147     4  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4133     5  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4217     6  2009-08-17  1   0   0   1   795 4217    4217    0   geforceerde invoer  2009-08-24 00:01:03
4105     7  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4119     8  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4140     9  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4203    10  2009-08-17  1   0   0   1   781 4203    4203    0   geforceerde invoer  2009-08-24 00:01:03
4270    10  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4210    11  2009-08-17  1   0   0   1   788 4210    4210    0   geforceerde invoer  2009-08-24 00:01:03
4224    12  2009-08-17  1   0   0   1   802 4224    4224    0   geforceerde invoer  2009-08-24 00:01:03
4112    13  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4126    14  2009-08-17  0   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4189    15  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4236    16  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL
4182    17  2009-08-17  1   0   0   0   NULL    NULL    NULL    NULL    NULL    NULL


Echter, zoals je ziet staat inlogID waarde 10 hier tweemaal in. Ik wil deze dus slechts éénmaal weergeven, en dan wel degene waarbij overruled de waarde 0 heeft. Dus enkel indien er meerdere records worden geselecteerd wil ik enkel dat record met overruled waarde 0. Andere records kunnen best wel waarde 1 hebben op overruled. Ik ben dus helemaal de weg krijtgeraakt hoe ik dit doe in SQL en ben er al enkele uren mee bezig. Wie kan me de link/duw in de juiste richting geven? Met HAVING en GROUP BY kom ik er iig niet uit

P.S. De echte dataset omvat enkele 10.000 records met nog veel meer verschillende data, daarom is met de hand geen oplossing ;)

Acties:
  • 0 Henk 'm!

  • rogierslag
  • Registratie: Maart 2005
  • Laatst online: 14-10-2024
na n tipje van iemand heb ik nu de query
code:
1
2
3
4
5
6
SELECT sum( attendance ) , count( * ) AS huh
FROM `beer_attendance` 
LEFT JOIN beer_attendance_history bah ON beer_attendance.ID = bah.oldID
WHERE datum = '2009-08-17'
GROUP BY inlogID, attendance
HAVING huh =1
geeft netjes de rijen die ik wil hebben, maar telt ze niet allemaal bij elkaar op, het resultaat is
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1   1
0   1
1   1
1   1
1   1
1   1
1   1
0   1
0   1
0   1
1   1
1   1
0   1
1   1
0   1
1   1
1   1
Nu moet ik enkel een manier verzinnen om de eerste kolom alle waarden op te tellen. En die weet ik niet...

Acties:
  • 0 Henk 'm!

  • _Sunnyboy_
  • Registratie: Januari 2003
  • Laatst online: 22:39

_Sunnyboy_

Mooooooooooooooooo!

Beetje lastig om te helpen met de beschikbare info.

Wat zijn die twee tabellen? Wat probeer je te bereiken? Per loginID 1 regel met daarin wat?

Beetje meer uitleg zou handig zijn.

Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 17:16

Dido

heforshe

Zoiets toevoegen? Is niet bijster performant, maar met 10K records is dat niet zo'n groot probleem?
SQL:
1
AND bah.overruled = ( select MIN(overruled) from beer_attendance_history bah2 where bah2.inlogID = bah.inlogID)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • rogierslag
  • Registratie: Maart 2005
  • Laatst online: 14-10-2024
Probleem opgelost. Mijn denkpatroon was oorspronkelijk goed, maar een van de programmeurs van een van de applicaties die deze database gebruiken had de specificatie niet goed geïmplementeerd. Als je nergens een update doet waarin je de "oude" rij depraced maakt dan snapt de rest van de database en logica dat ook niet...

Query is nu zo:
code:
1
SELECT sum(attendance) FROM `beer_attendance` ba LEFT JOIN users_login ul ON ba.inlogID = ul.ID WHERE ba.datum = '2009-08-17' AND ba.ID NOT IN ( SELECT oldID from beer_attendance_history bah ) AND ul.deleted='0'


En de laatste uitleg. Als eer rij in beer_attendance werd gewijzigd, werd overruled op 1 gezet en werd er een nieuwe rij aangemaakt in beer_attendance met de goede info. Vervolgens koppelde een rij in beer_attendance_history deze twee rijen via oldID en newID. Maar indien een gebruiker niet invoerde zette het systeem oldID en newID op een gelijke waarde van de oude rij en werd de rij in beer_attendance op overruled gezet. Die laatste stap deed die ene applicatie dus niet, waardoor de logica in elke applicatie op hol sloeg. Fout is verholpen en database gerepareerd (wat best wel kut werk was trouwens...)