Merge Sql Fields
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
// Tabel
id | woord1 | woord2 | woord3 | inhoud | datum
1 | php | mysql | xml | ......... | DDMMYY
2 | water | paradox| php | .......... | DDMMYY
// Query
"SELECT woord1, COUNT(woord1) AS num_w1 FROM tabel WHERE GROUP BY tabel.woord1 HAVING num_w1 >= 1"
id | woord1 | woord2 | woord3 | inhoud | datum
1 | php | mysql | xml | ......... | DDMMYY
2 | water | paradox| php | .......... | DDMMYY
// Query
"SELECT woord1, COUNT(woord1) AS num_w1 FROM tabel WHERE GROUP BY tabel.woord1 HAVING num_w1 >= 1"
In deze query vraag ik alle woorden op die minimaal een keer voorkomen (in de praktijk een getal van rond de twintig), nu heb ik meerdere woorden, is het mogelijk om de COUNT functie op alle drie de velden te richten?
(num_XX geeft dan bij 'php' 2)
Ik weet dat op deze manier de structuur niet optimaal is, maar ik wil liever het op deze manier laten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
d.woord,
COUNT(1) as aantal
FROM (
SELECT a.woord1 as woord FROM tabel as a
UNION ALL
SELECT b.woord2 as woord FROM tabel as b
UNION ALL
SELECT c.woord3 as woord FROM tabel as c
) as d
GROUP BY
woord
HAVING
aantal >= 1
d.woord,
COUNT(1) as aantal
FROM (
SELECT a.woord1 as woord FROM tabel as a
UNION ALL
SELECT b.woord2 as woord FROM tabel as b
UNION ALL
SELECT c.woord3 as woord FROM tabel as c
) as d
GROUP BY
woord
HAVING
aantal >= 1
[insert dreigende woorden over het werken met een niet optimaal datamodel hier]
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
En wat nou wanneer ik ook nog een WHERE waarde = 0 wil toevoegen? Dan geeft het script dat 'waarde' niet bestaat.
Wat is waarde? Iets uit de tabel tabel? Want dat is lastiger, omdat al die regels al gegroepeerd worden. Dan zou je iets met een JOIN moeten doen op de buitenste query.
Ik ben er al uit, hoe zou ik volgens jou/jullie mijn datamodel dan wél moeten inrichten?
En aangezien iedereen het in het begin fout doet (iedereen begint immers ook met te veel variabelen binnen quotes en zonder enige beveiliging tegen dingen als SQL injection) is er natuurlijk een hele populaire tutorial :D
Die query waar je net naar op zoek was zou dan veel makkelijker (en, jaja, sneller!) kunnen.
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
En waar komt dat in dit geval op neer? Dat kan ik niet direct uit die tutorial opmaken.
Tabel met inhoud
- id (INT, AUTO_INCREMENT)
- inhoud (TEXT)
- datum (DATETIME)
Tabel met woorden
- id (INT, AUTO_INCREMENT)
- woord (VARCHAR)
Tabel met woord-inhoud paren
- woord_id (INT)
- inhoud_id (INT)
Om eerlijk te zijn vind ik de woorden-tabel een beetje ver gaan als je het alleen bij woorden houdt (en niet andere informatie er ook bij gaat opslaan) Wanneer je het zo zou doen, een één-op-meer relatie, zou je geen functies missen, maar worden je queries wel wat simpeler. Het is dan wel weer wat minder genormaliseerd, en dus theoretisch gezien slechter:
Tabel met inhoud
- id (INT, AUTO_INCREMENT)
- inhoud (TEXT)
- datum (DATETIME)
Tabel met woorden
- inhoud_id (INT)
- woord (VARCHAR)
Wil je het helemaal goed doen (geloof me, dat wil je ;) ) dan kies je InnoDB als table engine (die optie heb je bij het aanmaken van een tabel) en voeg je daarna foreign key contraints toe. Zo dwing je dat het nummertje dat je bij woorden.inhoud_id opgeeft ook daadwerkelijk bestaat in de kolom inhoud.id.