Data van twee tabellen ordenen op één veld
Ik heb een probleempje en weet niet of die makkelijk op te lossen is. Op een website komen de berichten te staan uit de database. Er zijn twee soorten berichten die allebei in een aparte tabel staan met allebei aparte velden, ze hebben alleen id, datum en naam gelijk. Kan ik dan middels één query alle data opvragen uit beide tabellen en deze dan ordenen op datum? Dat ze zeg maar gemixed worden, gesorteerd op datum? Hieronder een duidelijk voorbeeld:
Code (php)
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
35
36
37
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
35
36
37
tabel 1:
.---------------------------------------------.
| id | reeksid | naam | volgorde | datum |
|---------------------------------------------|
| 1 | 3 | test | 5 | 22-03-2008 |
| 2 | 2 | rood | 2 | 11-02-2008 |
| 3 | 3 | geel | 4 | 04-02-2008 |
| 4 | 4 | roze | 3 | 31-07-2008 |
| 5 | 4 | cbkw | 1 | 16-11-2008 |
.---------------------------------------------.
tabel 2:
.-----------------------------------.
| id | naam | volgorde | datum |
|-----------------------------------|
| 1 | sick | 1 | 29-03-2008 |
| 2 | blue | 2 | 31-01-2008 |
| 3 | give | 5 | 15-08-2008 |
| 4 | free | 4 | 03-01-2008 |
| 5 | star | 3 | 21-05-2008 |
.-----------------------------------.
samengevoegde tabel op datum gesorteerd:
.-----------------------------------.
| id | naam | volgorde | datum |
|-----------------------------------|
| 4 | free | 4 | 03-01-2008 |
| 2 | blue | 2 | 31-01-2008 |
| 3 | geel | 4 | 04-02-2008 |
| 2 | rood | 2 | 11-02-2008 |
| 1 | test | 5 | 22-03-2008 |
| 1 | sick | 1 | 29-03-2008 |
| 5 | star | 3 | 21-05-2008 |
| 4 | roze | 3 | 31-07-2008 |
| 3 | give | 5 | 15-08-2008 |
| 5 | cbkw | 1 | 16-11-2008 |
.-----------------------------------.
.---------------------------------------------.
| id | reeksid | naam | volgorde | datum |
|---------------------------------------------|
| 1 | 3 | test | 5 | 22-03-2008 |
| 2 | 2 | rood | 2 | 11-02-2008 |
| 3 | 3 | geel | 4 | 04-02-2008 |
| 4 | 4 | roze | 3 | 31-07-2008 |
| 5 | 4 | cbkw | 1 | 16-11-2008 |
.---------------------------------------------.
tabel 2:
.-----------------------------------.
| id | naam | volgorde | datum |
|-----------------------------------|
| 1 | sick | 1 | 29-03-2008 |
| 2 | blue | 2 | 31-01-2008 |
| 3 | give | 5 | 15-08-2008 |
| 4 | free | 4 | 03-01-2008 |
| 5 | star | 3 | 21-05-2008 |
.-----------------------------------.
samengevoegde tabel op datum gesorteerd:
.-----------------------------------.
| id | naam | volgorde | datum |
|-----------------------------------|
| 4 | free | 4 | 03-01-2008 |
| 2 | blue | 2 | 31-01-2008 |
| 3 | geel | 4 | 04-02-2008 |
| 2 | rood | 2 | 11-02-2008 |
| 1 | test | 5 | 22-03-2008 |
| 1 | sick | 1 | 29-03-2008 |
| 5 | star | 3 | 21-05-2008 |
| 4 | roze | 3 | 31-07-2008 |
| 3 | give | 5 | 15-08-2008 |
| 5 | cbkw | 1 | 16-11-2008 |
.-----------------------------------.
Weet iemand welke query ik hiervoor moet gebruiken?
Alvast bedankt,
Stijn
Gewijzigd op 01/01/1970 01:00:00 door S van Lussel
Dat kan met een UNION. Maar eigenlijk klopt je datamodel niet. Lees een tutorial over normaliseren.
Welke database gebruik je, welk datatype voor de datum gebruik je en hoe ziet jouw huidige query er uit?
Edit:
Oei, te laat. De reacties van Jan en Frank zijn veel nuttiger...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Alvast bedankt,
Stijn
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
id,
naam,
volgorde,
datum
FROM
tabel1
UNION SELECT
id,
naam,
volgorde,
datum
FROM
tabel2
ORDER BY
datum ASC
id,
naam,
volgorde,
datum
FROM
tabel1
UNION SELECT
id,
naam,
volgorde,
datum
FROM
tabel2
ORDER BY
datum ASC
Maar zoals gezegd zal deze query op dit moment geen juiste resultaten teruggeven. Jouw datum is geen datum, dus kun je er onmogelijk op sorteren...
Verder zou ik ook nog maar eens kijken naar het normaliseren van je datamodel. Ik weet niet hoe je datamodel er nu uit ziet, maar dit kan waarschijnlijk een hoop problemen in de toekomst voorkomen!
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
(
SELECT id, naam, volgorde, datum
FROM tabel1
)
UNION
(
SELECT id, naam, volgorde, datum
FROM tabel2
)
waar je die ORDER BY dan precies moet plaatsen kan ik uit mijn hoofd niet zeggen. Testen dus ;)
Jan Koehoorn schreef op 21.01.2008 23:30:
Die mag gewoon aan het einde van de query :-)waar je die ORDER BY dan precies moet plaatsen kan ik uit mijn hoofd niet zeggen.
Haha ja ik heb de website niet gemaakt maar moest alleen een aanpassing doen dus ik ga niet het hele database model aanpassen want dan moet ik ook weer de hele site gaan omgooien en daar krijg ik niet voor betaald.. ;-) maar bedankt voor jullie snelle en goede hulp, ik ga het morgen even uitproberen!
Als je het zelf niet hebt gemaakt, en daar niet voor betaald krijgt, kan je het nog wel aanpassen.. Vraag je gewoon wat meer..
Zoals het nu is kost het heel veel moeite om het gesorteerd te krijgen op datum, waarom:
Omdat je database zelf nu niet op die datum kan sorteren. Je kan wel met strtodate alles omzetten naar een geldige datum, en die terugzetten in de database, of alles omzetten bij ophalen en in een array plaatsen en deze sorteren op datum.
Als je in de opdracht hebt gekregen ze te sorteren op datum, tjah.. Dan zou ik toch echt aanraden om een date type in je tabel te gebruiken in plaats van de huidige string, anders krijg je daar nog een harde kluif aan.
Okee, dan zul je deze "stoplap" moeten toepassen. Als ik jou was, zou ik het wel aan de klant mededelen. Dan weten ze namelijk dat ze de volgende keer beter jou kunnen inhuren.
Met hooguit een 10-tal records in je tabellen kun je hier aan beginnen, anders zul je echt even de database moeten aanpassen. Waarschijnlijk niet een hele grote klus, maar wel eentje die vroeg of laat toch moet gebeuren.
SELECT CONCAT(SUBSTR(veld, 7, 4), '-', SUBSTR(veld, 4, 2), '-',SUBSTR(veld, 1, 2)) AS nieuwe_datum
Inderdaad, zoiets mag het worden. Dit is, gezien de performance, meer iets om de foute 'datum' te migreren naar een echte datum en dus voor een UPDATE-query. Dit in een SELECT uitvoeren en dan gaan sorteren, is geen goed plan, daar kan MySQL geen index bij gebruiken, die is er namelijk niet. Nu is MySQL daar toch al geen ster in, maar toch.