Sortering MySQL tabel
is een mysql-tabel default gesorteerd of is er een manier om dat voor elkaar te krijgen?
Groeten,
slibbe
Gewijzigd op 01/01/1970 01:00:00 door Stefan Libbe
Een mysql tabel loopt standaart op ID (als je deze hebt) van 1 tot ....
En met de functie ORDER BY kun je dat in je Query aanpassen.
.. Niet helemaal waar.. ze worden standaard getoond op volgorde waarin de records zijn toegevoegd. (dit hoeft niet persé de volgorde van de ID's te zijn ;)
Ik vrees dat het probleem er in zit dat ik uit ga van de foreign key en samengestelde sleutels, alleen worden die niet ondersteund in ISAM files.
Ik wil kunnen lezen op id en volgnr.
Moet ik dan naar INNODB?
SELECT * FROM TABLE WHERE ... ORDER BY id ASC, volgnummer ASC
Zolang de tabel klein is, is daar weinig op tegen. Als de tabel groot wordt, lijkt me het niet ideaal de hele tabel in geheugen te laden, maar misschien valt dat mee.
Ik zou liever de relevante records inlezen.
Ben benieuwd tegen welke nadelen ik ga aanlopen ;)
Je kan je query zo ingewikkeld maken als je zelf wilt en alsnog een ORDER BY toevoegen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
id,
voornaam,
achternaam,
adres
FROM gegevens
WHERE id = (
SELECT id
FROM facturen
WHERE betaald = 0
)
ORDER BY achternaam, voornaam
LIMIT 0,20;
id,
voornaam,
achternaam,
adres
FROM gegevens
WHERE id = (
SELECT id
FROM facturen
WHERE betaald = 0
)
ORDER BY achternaam, voornaam
LIMIT 0,20;
Nu krijg je een lijstje met mensen die hun factuur nog niet hebben betaald gesoorteerd op achternaam en daarna op voornaam. Van a-z.
Er worden maximaal 20 records weergegeven (en dus ook niet meer dan dat ingeladen).
Maar die LIMIT is in dit voorbeeld natuurlijk beetje raar, maar je snapt hopelijk zo wel dat je op die manier je query zo kan aanpassen dat je niet alles hoeft te selecteren en in te lezen.
Wat ik wil is prikken met bv id=51. Als er één zo'n record is, dan is het volgnr 0. Als er meerdere records met dat id=51 zijn, dan is de vraag hoeveel er dat zijn, wat te zien is aan de opeenvolgende volgnrs 0,1,2,3,...
Vervolgens kun je dan natuurlijk een volgnr toevoegen, maar dat is natuurlijk een klein kunstje.
Ik kom er wel uit met een tabel zonder key, en dan zelf de verschillende dingen programmeren, maar het lijkt me niet de handigste methode.
Quote:
Dat druk je nog voorzichtig uit! Dit is ronduit slecht. Sterker nog, slechter dan slecht!Ik kom er wel uit met een tabel zonder key, en dan zelf de verschillende dingen programmeren, maar het lijkt me niet de handigste methode.
Waarom zal men in het verleden toch een key hebben uitgevonden? Omdat het een waardeloos iets is? Dacht het niet... Ga je database eens normaliseren en ga eens een fatsoenlijk systeem opzetten. Ik krijg nu de indruk dat je zelf een DBMS wilt gaan bouwen, maar dan in PHP.
Oh ja, een database is veel meer dan alleen een bak met gegevens. De intelligentie die er achter zit, bv. indexen e.d., is veel belangrijker. Al is dat juist 1 van de zwakste punten van MySQL wanneer je het vergelijkt met PostgreSQL, Oracle, DB2, etc.
Pholeron:
@leo
.. Niet helemaal waar.. ze worden standaard getoond op volgorde waarin de records zijn toegevoegd. (dit hoeft niet persé de volgorde van de ID's te zijn ;)
.. Niet helemaal waar.. ze worden standaard getoond op volgorde waarin de records zijn toegevoegd. (dit hoeft niet persé de volgorde van de ID's te zijn ;)
Ik bedoel, die zijn meestal uniek en daarom worden die altijd standaart gesorteerd (die lopen dus op volgorde)
Leo:
Ik bedoel, die zijn meestal uniek en daarom worden die altijd standaart gesorteerd (die lopen dus op volgorde)
Nee, dat is slechts een bijkomstigheid in een aantal gevallen. Hij sorteert gewoon op toevoegen van records, daar heeft de ID verder weinig (lees: niets) mee te maken.Pholeron:
@leo
.. Niet helemaal waar.. ze worden standaard getoond op volgorde waarin de records zijn toegevoegd. (dit hoeft niet persé de volgorde van de ID's te zijn ;)
.. Niet helemaal waar.. ze worden standaard getoond op volgorde waarin de records zijn toegevoegd. (dit hoeft niet persé de volgorde van de ID's te zijn ;)
Ik bedoel, die zijn meestal uniek en daarom worden die altijd standaart gesorteerd (die lopen dus op volgorde)
Quote:
Oh ja, een database is veel meer dan alleen een bak met gegevens. De intelligentie die er achter zit, bv. indexen e.d., is veel belangrijker. Al is dat juist 1 van de zwakste punten van MySQL wanneer je het vergelijkt met PostgreSQL, Oracle, DB2, etc.
Volgens mij zitten er in die anders DBMS'en ook indexen. Oracle is trouwens veel ingewikkelder/professioneler dan MySQL.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Het optimaliseren van je queries door het plaatsen van extra indexen, is binnen MySQL dan ook niet zo heel erg zinvol. Met andere databases valt daar een hoop tijdswinst mee te halen.
MySQL is het debiele neefje binnen de database-familie...
Wat doe je met een dergelijk probleem als de key maar uit één veld mag bestaan?
Een primairy key kan uit meerdere velden bestaan, zie de handleiding.
PRIMARY KEY (voornaam, achternaam)
Frank:
'een tabel zonder key' en 'een key bestaand uit meerdere velden' zijn 2 totaal verschillende dingen! In het eerste geval heb je geen key, in het tweede geval het je wél een key.)
Ja, dat lijkt me duidelijk.
Quote:
Een primairy key kan uit meerdere velden bestaan, zie de handleiding.
PRIMARY KEY (voornaam, achternaam)
PRIMARY KEY (voornaam, achternaam)
Really? Dat is goed nieuws.
Ik heb te maken met MySQL 3.23.58 . Ik kan niet direct vinden dat dat een probleem zou moeten opleveren wat dit betreft. phpMyAdmin versie 2.7.0 pl1. Wellicht dat ik daarin een beperking moet zoeken.
off-topic: prettig dat er gereageerd wordt op newbie-berichten overigens.
Gewijzigd op 01/01/1970 01:00:00 door Stefan Libbe
Tabel met een primary key
met meerdere kolommen:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
CREATE TABLE test(
id INT(10) unsigned NOT NULL default '0',
id2 INT(10) unsigned NOT NULL default '0',
veld1 VARCHAR(100) NOT NULL default '',
PRIMARY KEY ( id, id2 )
);
id INT(10) unsigned NOT NULL default '0',
id2 INT(10) unsigned NOT NULL default '0',
veld1 VARCHAR(100) NOT NULL default '',
PRIMARY KEY ( id, id2 )
);
Tabel met een primary key
met meerdere kolommen en
een index met meerdere kolommen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CREATE TABLE test(
id INT(10) unsigned NOT NULL default '0',
id2 INT(10) unsigned NOT NULL default '0',
veld1 VARCHAR(100) NOT NULL default '',
PRIMARY KEY ( id, id2 ),
KEY index1 ( id, id2, veld1(20) )
);
id INT(10) unsigned NOT NULL default '0',
id2 INT(10) unsigned NOT NULL default '0',
veld1 VARCHAR(100) NOT NULL default '',
PRIMARY KEY ( id, id2 ),
KEY index1 ( id, id2, veld1(20) )
);
edit:
Trouwens "INT(10)" heeft niets met de maximale grote van het veld te maken.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Ik moet even kijken wat dit betekent.
Thx.