Toon posts:

[mySQL]middelste rijen filteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
De titel is misschien niet helemaal duidelijk maar ik weet het niet beter te omschrijven.

Ik heb de volgende tabel met gegevens: (simpel weergegeven):
code:
1
2
3
4
5
6
7
8
| a | b |
  1   1
  1   2
  1   3
  1   4
  2   5
  2   6
  4   7


Daaruit moet ik een aantal rijen verwijderen:
- alle rijen waarvan de a waarde maar in 1 rij voorkomt
- de rijen waarvan de a waarde meer dan 2 keer voorkomt alleen de eerste en laatste bewaren.

In dit geval moet ik dus terug krijgen:
code:
1
2
3
4
5
| a | b |
  1   1
  1   4
  2   5
  2   6


Het lijkt me dat het vrij simpel moet kunnen maar ik kom er niet uit. Ik kan er ook vrijwel niets over vinden

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

"- alle rijen waarvan de a waarde maar in 1 rij voorkomt"
Waarom wordt 4 7 dan niet terug gegeven? Die komt toch maar 1x voor?
"- de rijen waarvan de a waarde meer dan 2 keer voorkomt alleen de eerste en laatste bewaren."
Om 'eerste' en 'laatste' gedefinieerd te hebben zul je ook een volgorde moeten definieren.

Ik denk dat je mbv HAVING hier wel iets mee kunt doen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Wat heb je zelf al geprobeert?

Ik denk dat je m.b.v. MIN() en MAX() wel een eind kan komen, als je met "de eerste" tenminste de laagste waarde van b, en met "de laatste" de hoogste waarde van b bedoelt. Overigens mis je in je voorbeeld je eerste voorwaarde dat alle rijen waarvan waarde a maar 1 keer voorkomt getoond moeten worden (a=4, b=7).

edit:
Hmm.. Janoz is me voor ;)

[ Voor 10% gewijzigd door Creepy op 12-08-2003 10:49 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • SaiBork
  • Registratie: Februari 2000
  • Laatst online: 02-11-2023
Daaruit moet ik een aantal rijen verwijderen:
- alle rijen waarvan de a waarde maar in 1 rij voorkomt

beter lezen guys ;)
hij wilt hem juist verwijderd hebben :P

en met MIN() en MAX() moet idd wel iets kunnen lijkt mij

Verwijderd

Topicstarter
Het klopt inderdaad dat de enkele rijen juist weg moeten. Maar dat is het probleem niet zo, dat lukt wel :)

Min en max lukt me niet omdat te doen per a waarde, wat ik tot nu toe heb is:
code:
1
2
3
4
5
6
DELETE FROM testtabel 
WHERE (
    a != MIN( a ) 
    AND 
    a != MAX( a ) 
) GROUP BY a

Maar zoals ik zelf al verwachtte werkt dat niet.

En inderdaad, het gaat om de laagste en hoogste waarde van b (die staan wel altijd op volgorde dus komt het neer op de eerste en laatste)

[ Voor 17% gewijzigd door Verwijderd op 12-08-2003 11:02 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Oops. iets beter lezen dus ;)

Dat min en max is voor je tweede voorwaarde, voor het selecteren dus. Voor het verwijderen zul je HAVING i.c.m. met een andere functie moeten gebruiken zodat je het aantal voorkomens van A kan tellen. Tellen, rara welke functie zou dat zijn :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Verwijderd schreef op 12 augustus 2003 @ 11:00:
Het klopt inderdaad dat de enkele rijen juist weg moeten. Maar dat is het probleem niet zo, dat lukt wel :)

Min en max lukt me niet omdat te doen per a waarde, wat ik tot nu toe heb is:
code:
1
2
3
4
5
6
DELETE FROM testtabel 
WHERE (
    a != MIN( a ) 
    AND 
    a != MAX( a ) 
) GROUP BY a

Maar zoals ik zelf al verwachtte werkt dat niet.

En inderdaad, het gaat om de laagste en hoogste waarde van b (die staan wel altijd op volgorde dus komt het neer op de eerste en laatste)
Je zult moeten werken met een GROUP BY en een DELETE. Helaas kan mysql dat niet... http://darkstar.ist.utl.pt/mysql/doc/en/DELETE.html

Localhost, sweet localhost


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Inderdaad, ik heb het niet goed gelezen. Je 2e voorwaarde zou nog steeds gedaan kunnen worden mbv een HAVING clausule. De eerste voorwaarde wordt alleen erg lastig. Met een geneste query zou je alles eruit kunnen halen wat niet 2x voorkomt, maar dat kan (nog?) niet in MySQL. Is er neit een andere mogenlijkheid om dezelfde gegevens te kunnen opvragen door je database model iets aan te passen?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Aha dat verklaart waarom ik de volgende query niet in een delete om kon zetten. Maar nu pakt hij gelijk alle juiste rijen en daarmee kan ik ook een goede tabel maken dus ik ben allang blij :) De volgende is het geworden:
code:
1
2
3
4
SELECT MIN( b ) , MAX( b ) 
FROM testtabel
GROUP BY a
HAVING COUNT( a ) >= 2

Bedankt voor de hulp, zonder de having hint was het niet gelukt en zo heb ik toch weer wat dingen geleerd B)

[edit]
>= 2 ipv >2

[ Voor 6% gewijzigd door Verwijderd op 12-08-2003 11:56 ]

Pagina: 1