Merge Sql Fields

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Steen

steen

26/04/2009 21:21:00
Quote Anchor link
Is het mogelijk om in SQL velden te mergen (als SELECT query)? Ik geef even een voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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"

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.
 
PHP hulp

PHP hulp

29/03/2024 11:53:25
 
Jelmer -

Jelmer -

26/04/2009 21:32:00
Quote Anchor link
Dit zou moeten werken. Let erop dat je UNION ALL gebruikt, anders maakt MySQL er automatisch UNION DISTINCT van, en is aantal altijd 1.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


[insert dreigende woorden over het werken met een niet optimaal datamodel hier]
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Steen

steen

26/04/2009 21:44:00
Quote Anchor link
En wat nou wanneer ik ook nog een WHERE waarde = 0 wil toevoegen? Dan geeft het script dat 'waarde' niet bestaat.
 
Jelmer -

Jelmer -

26/04/2009 22:11:00
Quote Anchor link
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.
 
Steen

steen

26/04/2009 22:12:00
Quote Anchor link
Ik ben er al uit, hoe zou ik volgens jou/jullie mijn datamodel dan wél moeten inrichten?
 
Jelmer -

Jelmer -

26/04/2009 22:29:00
Quote Anchor link
Geen dubbele data, en de relaties tussen regels duidelijk vastgelegd en goed zichtbaar. Of kortweg: genormaliseerd. Het oogt misschien langzamer omdat je meer tabellen nodig hebt, maar langzamer zal het niet snel zijn, en je hebt er later zoveel meer plezier van :)

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 -
 
Steen

steen

26/04/2009 22:32:00
Quote Anchor link
En waar komt dat in dit geval op neer? Dat kan ik niet direct uit die tutorial opmaken.
 
Jelmer -

Jelmer -

26/04/2009 22:43:00
Quote Anchor link
Dat je een tabel hebt met de inhoud, en een tabel met de daaraan gekoppelde woorden, en een tabel met de woorden zelf. Het is wel meteen de meest complexe relatie die je zal tegenkomen–de meer-op-meer relatie–maar je kan dan oneindig veel woorden hangen aan de inhoud.
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.