Dubbele records weren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Toppe
  • Registratie: Januari 2004
  • Laatst online: 22:29

Toppe

Oké ✅

Topicstarter
Geachte mede tweakers,

Momenteel ben ik bezig met een nieuw voorraad systeem voor op het werk. Het meeste werk is al klaar, maar ik zit met een uitdaging.

Momenteel gaat elke boeking als een aparte record een mysql tabel in. Dat houd in dat als ik 15 artikelen bestel ik ook 15 records in de database zie staan.

Echter, zodra je op de website komt krijg je een overzicht met artikelen die (bijna) op zijn, en een overzicht met de openstaande bestellingen.

Zoals jullie al kunnen raden, alle 15 records met de status 'besteld' krijg ik nu ook in dit overzicht te zien.

Heeft iemand enig idee hoe ik deze records kan weren? Uiteraard zou ik een ordernummer kunnen wegschrijven naar een array en dan gewoon de functie if(in_array()) kunnen toepassen, maar dit is neem ik aan niet de snelste optie.

Momenteel zie ik door de bomen het bos niet meer. Misschien handig om de tabel er bij te hebben?

Ordernummer moet dus éénmalig worden weergegeven, ook al zijn er 15 records met het zelfde ordernummer.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS `bestellingen` (
  `id` int(11) NOT NULL auto_increment,
  `artikelnummer` char(10) NOT NULL,
  `soort` enum('inkomend','uitgaand','onderling','defect','besteld') NOT NULL default 'inkomend',
  `medewerker_besteld` int(3) NOT NULL,
  `medewerker_uitgifte` int(3) NOT NULL COMMENT '{ID1};{ID2} voor onderling boeken.',
  `medewerker_geboekt` int(3) NOT NULL,
  `aantal` int(5) NOT NULL,
  `aantal_besteld` char(5) NOT NULL,
  `datum` date NOT NULL,
  `ordernummer` char(25) NOT NULL,
  `status` enum('besteld','geboekt','gebruiker') NOT NULL default 'besteld',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=39 ;

Donstil: Je moet kopen wat je wilt hebben. Niet wat je nodig hebt!


Acties:
  • 0 Henk 'm!

  • Mint
  • Registratie: Mei 2005
  • Laatst online: 22:11
SELECT DISTINCT? :)

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Ik denk dat je op zoek bent naar "GROUP BY".

Het is misschien een goed idee als je de FAQ's over SQL even doorleest, die beschrijven precies hoe je GROUP BY e.d. moet gebruiken

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 22-09 11:30
Is het niet handiger om een tabel te maken voor Bestelling en Bestellingsregel? Misschien dat er later wel meerdere attributen aan een Bestelling komen te hangen en die wil je niet in ieder record voor een besteld artikel herhalen.

Acties:
  • 0 Henk 'm!

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 16:04
Amras schreef op dinsdag 08 november 2011 @ 17:30:
Is het niet handiger om een tabel te maken voor Bestelling en Bestellingsregel? Misschien dat er later wel meerdere attributen aan een Bestelling komen te hangen en die wil je niet in ieder record voor een besteld artikel herhalen.
Lijkt me ook, hij heeft nu in 1 tabel bestellingen en artikel voorraad staan. Dat zou ik zowiezo opsplitsen.
Dus een tabel voor Artikel gegevens, een Bestelling tabel en een Bestellingregel tabel. Dat scheelt je later heel veel problemen.

[ Voor 12% gewijzigd door urk_forever op 08-11-2011 17:35 ]

Hail to the king baby!


Acties:
  • 0 Henk 'm!

  • Toppe
  • Registratie: Januari 2004
  • Laatst online: 22:29

Toppe

Oké ✅

Topicstarter
Hi,

Er is een aparte tabel voor artikelvoorraden, de 'aantallen' staan in de tabel bestellingen zodat je later altijd kan terug kijken wat waarneer besteld is.

Zodra er een artikel geboekt is, gaat de huidigevoorraad in de tabel artikelen omhoog (huidigevoorraad+aantal_geboekt = nieuw huidigevoorraad)

code:
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `artikelen` (
  `id` int(5) NOT NULL auto_increment,
  `artikelnummer` char(10) NOT NULL,
  `artikelnaam` text NOT NULL,
  `verpakkingseenheid` varchar(255) NOT NULL,
  `standaardvoorraad` int(5) NOT NULL,
  `huidigevoorraad` int(5) NOT NULL,
  `actief` varchar(255) NOT NULL default 'ja',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=36 ;

[ Voor 40% gewijzigd door Toppe op 08-11-2011 17:47 ]

Donstil: Je moet kopen wat je wilt hebben. Niet wat je nodig hebt!


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Group by danwel distinct is basic SQL kennis. Bovendien zijn die termen behoorlijk logisch, dikke kans dat je ze al vanzelf intikt als je een Engelse Google query doet. :P

Als GROUP BY nieuw voor je is, wil je wellicht sowieso eerst de documentatie nalezen, alsmede Hoe werkt dat GROUP BY nu eigenlijk?

En nog wat tips:
1 Gebruik InnoDB engine, MyISAM is al minstens 5 jaar op alle fronten achterhaald en godzijdank ook niet langer meer de default.
2. Vervang die comment over FK's, door, jawel, een echte FK, welke ook echt werkt als InnoDB gebruikt.
3. Denk aub goed na over de datamodel opmerkingen, je kan imo toch echt beter je huidige tabel opslitsen in iets van order en order_items

edit:
Nme: standaard riedeltje mbt FTS en InnoDB: Dat zit in de komende versie, en biedt nog maar dan de FTS van MyISAM. Bovendien performeert de FTS van MyISAM dramatisch zodra je table uberhaupt een beetje gevuld is.
En bovendien heeft TS uberhaupt geen extra indexen. 8)7

[ Voor 15% gewijzigd door Voutloos op 08-11-2011 22:15 ]

{signature}


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Toppe schreef op dinsdag 08 november 2011 @ 17:46:
Hi,

Er is een aparte tabel voor artikelvoorraden, de 'aantallen' staan in de tabel bestellingen zodat je later altijd kan terug kijken wat waarneer besteld is.
Dat heeft nog niets te maken met het standaardvoorbeeld van orders en orderlines dat je in elke cursus SQL voor je neus krijgt. Zoek dat maar even op, dat lost denk ik al een groot deel van je probleem op zonder distinct en zonder group by.
Voutloos schreef op dinsdag 08 november 2011 @ 20:24:
1 Gebruik InnoDB engine, MyISAM is al minstens 5 jaar op alle fronten achterhaald en godzijdank ook niet langer meer de default.
Zeg dat tegen de mensen die FTS nodig hebben. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1