[MySQL] Alleen rijen met een bepaalde waarde.

Pagina: 1
Acties:

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Hallo,

Ik zit met een probleempje en heb geen idee hoe ik dat kan oplossen.

Ik heb de volgende tabel:
code:
1
2
3
4
5
6
7
8
id    soortid     soort
---------------------------
0     0              Repair
0     0              Repair
1     0              Repair
1     1              Spare
1     2              Garantie
2     1              Spare


Nou wil ik alleen de id's die alleen gebruikt zijn bij soortid = 0; in dit geval dus alleen id=0.

Met de onderstaande query laat hij namelijk ook id=1 zien.
code:
1
select distinct id from test where soortid = 0 and not soortid <> 0


Heb ook al op mysql.com zitten zoeken maar kan niet echt iets vinden om dit op te lossen.

Iemand een idee hoe je dit wel kan oplossen? Maak gebruik van MySQL 4.0 dus geen subquery's, views enz :(

alvast bedankt

[ Voor 8% gewijzigd door eppie op 25-01-2005 09:36 ]


  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Heel dat laatste stuk mag eraf

code:
1
select distinct id from test where soortid = 0

  • whoami
  • Registratie: December 2000
  • Laatst online: 16-05 10:09
Waarom doe je een where id = 0 and not id <> 0 ?

Wil je heel zeker zijn ofzo ? :D

https://fgheysels.github.io/


  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Met de genoemde query krijg ik als uitvoer:
code:
1
2
3
4
5
id    soortid     soort
---------------------------
0     0              Repair
0     0              Repair
1     0              Repair

En ik wil als uitvoer:
code:
1
2
3
4
id    soortid     soort
---------------------------
0     0              Repair
0     0              Repair

Ik wil dus de id's waar ALLEEN repair is gebruikt en niet ook iets anders.
Bij id=1 is oa ook een Spare gebruikt.

en dat met not erbij is iid beetje dom :P

[ Voor 18% gewijzigd door eppie op 25-01-2005 09:44 ]


Verwijderd

code:
1
2
3
4
5
6
7
8
SELECT
   * 
FROM
   tabel
WHERE 
   soortid = 0
AND
   NOT EXISTS (SELECT id FROM tabel WHERE soort =! Repair)



Zoiets ?

Verwijderd

-- hier stond iets doms --

[ Voor 91% gewijzigd door Verwijderd op 25-01-2005 10:00 ]


  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Verwijderd schreef op dinsdag 25 januari 2005 @ 09:57:
code:
1
2
3
4
5
6
7
8
SELECT
   * 
FROM
   tabel
WHERE 
   soortid = 0
AND
   NOT EXISTS (SELECT id FROM tabel WHERE soort =! Repair)



Zoiets ?
Kan geen gebruik maken van subquery's hier :(

Verwijderd

Heb ik een keer een creatieve goede oplossing ;)

Kan het niet, mmm, dat is minder ;)

Naja, dan weet ik niet of je het in 1 query kan doen omdat je wil kijken of iets bestaat.

Dan moet je het in een array gooien ?

en dan daar door heen loopen ?

  • OfNoAvail
  • Registratie: November 2001
  • Laatst online: 16-05 12:34

OfNoAvail

Beter een half gezegde...

Is dit dan niet logischer? Of denk ik (weer) te dom?

code:
1
2
3
4
5
6
SELECT
   * 
FROM
   tabel
WHERE 
   soort <> 'repair'

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
ofnoavail schreef op dinsdag 25 januari 2005 @ 10:08:
Is dit dan niet logischer? Of denk ik (weer) te dom?

code:
1
2
3
4
5
6
SELECT
   * 
FROM
   tabel
WHERE 
   soort <> 'repair'
Daar heb ik ook niets aan want dan krijg ik nog niet de id's wie ALLEEN gebruikt zijn bij 'Repair'.

Het in een array stoppen en dan checken kan wel maar dat word nogal traag omdat het over 500.000 records moet .

Het is namelijk de bedoeling om een overzicht te geven van de id's wie in ALLEEN elke soort voorkomen en welke in meerdere soorten voorkomen.

Verwijderd

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
// SQL
SELECT
   id,soort
FROM
   tabel
WHERE 
   soortid = 0

// PHP
foreach($result as $key=>$value)    {

    if($value['soort'] == 'Repair') {
        $id = $value['id'];
        // Weet niet of het klopt.
        // Dus als hij niet gevuld is -> vul hem
        if(!isset($checken[$id])) {
        
            $checken[$id] = 'Goed';
        
        }

    } else  {   
        $checken[$id] = 'Fout';
    }
}


foreach($checken as $id=>$value)    {
    
    if($value == 'Goed')    {
        
        echo "$id is alleen repair";
    }
}


Misschien beetje hakje takje touwtje. maar ik denk dat hij werkt, niet getest natuurlijk dus kan
hier en daar wel voud zijn

Verwijderd

Je moet niet alleen kijken wanneer soortid=0, maar ook kijken of count(soortid) gelijk is aan 1 (want dan komen er dus alleen maar nullen voor). Toch?

edit:
het klopt niet 100% wat ik zeg, maar volgensmij is dat wel de richting die je op moet :P

[ Voor 25% gewijzigd door Verwijderd op 25-01-2005 10:18 ]


Verwijderd

Ik was druk bezig :P

Maar ik zie dat de oplossing niet is.

Dan zou ik me mysql updaten of permissies regelt, dat je wel subqueries mag


Maar sorry , anders weet ik het ook niet.

  • bras
  • Registratie: Oktober 2000
  • Laatst online: 06-03 11:46
werkt dit niet:
code:
1
2
3
4
5
select id, count(id) as aantalsoorten
from   test
where  soortid = 0
and    aantalsoorten = 1
group  by soortid

[ Voor 3% gewijzigd door bras op 25-01-2005 10:23 ]

"When you find yourself in the company of a halfling and an ill-tempered Dragon, remember, you do not have to outrun the Dragon...you just have to outrun the halfling."


Verwijderd

Verwijderd schreef op dinsdag 25 januari 2005 @ 10:17:
Je moet niet alleen kijken wanneer soortid=0, maar ook kijken of count(soortid) gelijk is aan 1 (want dan komen er dus alleen maar nullen voor). Toch?
het klopt niet 100% wat ik zeg, maar volgensmij is dat wel de richting die je op moet :P
Ja, maar dan ga je met een subquerie werken, toch en dan kan het niet want hij kan geen subquerie

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
bras schreef op dinsdag 25 januari 2005 @ 10:19:
werkt dit niet:
code:
1
2
3
4
5
select id, count(id) as aantalsoorten
from   test
where  soortid = 0
and    aantalsoorten = 1
group  by soortid
Je bedoelt zo iets:
code:
1
SELECT * FROM test WHERE soortid = 0 having count(distinct soortid) = 1

Dit werkt echter wel op het voorbeeld tabelletje maar het probleem is als volgt:

Een id heeft een soort (Repair, Spare, Garantie, Single unit enz);
Nou zijn er stel groepen: Service, Equipment enz en gecombineerd.
Onder service vallen Repairs en spares.
Onder Equipement Garantie en nog een stel.

Nou wil ik dus tellen welke artikelen ALLEEN voor service zijn gebruikt, welke ALLEEN voor equipement zijn gebruikt en dan ook nog welke gecombineerd zijn dus zowel in service als in equipement zijn gebruikt en die mogen dus niet bij die bonenstaande Service enz zijn opgetelt. :(

Moet dan denk ik maar in code ipv SQL want upgraden is geen optie.

  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:46
bras schreef op dinsdag 25 januari 2005 @ 10:19:
werkt dit niet:
code:
1
2
3
4
5
select id, count(id) as aantalsoorten
from   test
where  soortid = 0
and    aantalsoorten = 1
group  by soortid
Dan zou ik eerder:
code:
1
2
3
4
select id, max(soortid) as max_soortid
from test
group by id
having max(soortid)=0

Doen.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


Verwijderd

SQL want upgraden is geen optie.
Mag ik vragen waarom niet ?

Ben altijd wel erg benieuwd waarom mensen/ bedrijven niet willen updaten

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Ik denk dat ik gewoon deze op elke soort los laat en dan zelf in code ga tellen.
code:
1
SELECT * FROM test WHERE soortid = 0 having count(distinct soortid) = 1


Omdat er veel meer software draait op die machine en ik hier alleen zit voor me stage en die niet al te lang meer duurt :)

Op langer termijn zit upgraden er mischien wel in.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik zit zo eens te kijken naar je tabel en ik moet eerlijk zeggen dat hij op mij wat vreemd overkomt.
Wat maakt een record in de tabel uniek? Want twee records met precies dezelfde waarden, dat riekt naar redundante gegevens en dan gaan bij mij de nekharen overeind staan. Vertel me alsjeblieft dat er nog meer kolommen in die tabel staan die het tot een uniek geheel maken.

En over de problemen die je beschrijft met groepen, kun je niet dezelfde truuk erop loslaten als je nu doet om alleen die id's op te halen die maar bij 1 soort horen? Dus joinen met de groepentabel (vertel me dat je groepen niet ook in dezelfde tabel hebt opgenomen, please) en having clauses toevoegen.

Maar mijn echte tip is: kijken of je het datamodel kunt aanpassen, want ik denk dat daar nog wel wat winst te halen valt :) Ik weet niet hoe groot jouw kennis is, maar het model naar de 2e normaalvorm brengen zou al een enorme verbetering zijn. Als je niet weet wat normaalvormen zijn, kan ik je aanraden om google eens ter hand te nemen en een half dagje te gaan zitten zoeken.

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
soorten zitten in een aparte tabel en de bovenstaande tabel bevat meer records :).

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Verwijderd schreef op dinsdag 25 januari 2005 @ 09:57:
code:
1
2
3
4
5
6
7
8
SELECT
   * 
FROM
   tabel
WHERE 
   soortid = 0
AND
   NOT EXISTS (SELECT id FROM tabel WHERE soort =! Repair)



Zoiets ?
Kan je IMO beter:
code:
1
select distinct * from 'test' where soortid = '0' and id = '0';
doen... ;)
Verwijderd schreef op dinsdag 25 januari 2005 @ 10:32:
Mag ik vragen waarom niet ?

Ben altijd wel erg benieuwd waarom mensen/ bedrijven niet willen updaten
Mag ik jou dan vragen, waarom je zou updaten? Op die manier blijf je namelijk bezig met updaten, en krijg je op een gegeven moment er een dagtaak aan... En (naar ik kan en mag aannemen) het systeem werkt toch goed, zoals het is, ook al worden er oudere versies van SQL gebruikt, maakt verder niet zo veel uit.

Natuurlijk zal je functies en dingen missen, maar dat is een keuze die je maakt, die functies en dingen wil je, of die wil je niet... Ligt er maar net aan wat je wilt, en of ze wel daadwerkelijk iets toevoegen aan je (web)applicatie(s). Updaten 'voor de heb' kan in het bedrijfsleven een duur geintje worden. Denk bijv. aan (web)applicatie(s) die opeens niet meer werken en omgebouwd moeten worden, zodat ze gaan werken... ;)

Komt er nog bij, dat als je wilt gaan updaten of upgraden, dat je (zeker in het bedrijfsleven) eerst het getest wil hebben, of het wel werkt... En daar gaat ook tijd (en dus geld) in zitten... ;)

[ Voor 67% gewijzigd door CH4OS op 28-01-2005 10:29 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
GJ-tje schreef op vrijdag 28 januari 2005 @ 09:49:
[...]
Kan je IMO beter:
code:
1
select distinct * from 'test' where soortid = '0' and id = '0';
doen... ;)
[...]
Mag ik jou dan vragen, waarom je zou updaten? Op die manier blijf je namelijk bezig met updaten, en krijg je op een gegeven moment er een dagtaak aan... En (naar ik kan en mag aannemen) het systeem werkt toch goed, zoals het is, ook al worden er oudere versies van SQL gebruikt, maakt verder niet zo veel uit.

Natuurlijk zal je functies en dingen missen, maar dat is een keuze die je maakt, die functies en dingen wil je, of die wil je niet... Ligt er maar net aan wat je wilt, en of ze wel daadwerkelijk iets toevoegen aan je (web)applicatie(s). Updaten 'voor de heb' kan in het bedrijfsleven een duur geintje worden. Denk bijv. aan (web)applicatie(s) die opeens niet meer werken en omgebouwd moeten worden, zodat ze gaan werken... ;)

Komt er nog bij, dat als je wilt gaan updaten of upgraden, dat je (zeker in het bedrijfsleven) eerst het getest wil hebben, of het wel werkt... En daar gaat ook tijd (en dus geld) in zitten... ;)
Je vroeg het wel niet aan mij, maar ik heb toch wel een antwoord voor je:
MySQL (versie 3.23 en eerder) geeft de suggestie dat het een implementatie van SQL hanteert, maar dit blijkt dus een incompleet te zijn. Bovendien is het geen relationele database.
Alleen die twee redenen zouden voor mij al genoeg zijn om te upgraden. Nu kun je probleem 2 natuurlijk oplossen door InnoDB te gaan gebruiken als tableformat, maar helaas los je daar probleem 1 niet mee op.
En als topreden: de gebruiker wil een stuk functionaliteit bouwen wat hij niet kan bewerkstelligen met het huidige systeem. Door te upgraden kan dit wel worden bewerkstelligd.

Dus er zijn wel redenen te bedenken om wel te upgraden die zich aardig staande houden tegen jouw redenen om het niet te doen :)

Blijft natuurlijk staan dat de klant uiteindelijk de beslissing moet nemen, dus als hij nee zegt dan is en blijft het ook nee. (Mits je natuurlijk erg hard je best hebt gedaan om hem van zijn ongelijk te overtuigen ;) )

edit:

kleine aanvulling op mysql puristen niet op mijn dak te krijgen :+

[ Voor 4% gewijzigd door bigbeng op 28-01-2005 16:19 ]

Pagina: 1