Data van twee tabellen ordenen op één veld

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

S van Lussel

S van Lussel

21/01/2008 21:32:00
Quote Anchor link
Hallo,

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)
PHP script in nieuw venster Selecteer het PHP script
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
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 |
.-----------------------------------.


Weet iemand welke query ik hiervoor moet gebruiken?

Alvast bedankt,
Stijn
Gewijzigd op 01/01/1970 01:00:00 door S van Lussel
 
PHP hulp

PHP hulp

03/01/2025 10:29:06
 
Jan Koehoorn

Jan Koehoorn

21/01/2008 21:34:00
Quote Anchor link
Dat kan met een UNION. Maar eigenlijk klopt je datamodel niet. Lees een tutorial over normaliseren.
 
Frank -

Frank -

21/01/2008 21:35:00
Quote Anchor link
Jouw datums zijn geen datums, iso-formaat yyyy-mm-dd, daar valt dus niet op te sorteren.

Welke database gebruik je, welk datatype voor de datum gebruik je en hoe ziet jouw huidige query er uit?
 
Joren de Wit

Joren de Wit

21/01/2008 21:37:00
Quote Anchor link
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
 
S van Lussel

S van Lussel

21/01/2008 23:23:00
Quote Anchor link
Het gaat niet zozeer om die data velden maar meer op de manier waarop het zou kunnen. Ik heb namelijk even snel een voorbeeldje in elkaar gezet zonder na te denken over de volgorde van de date velden. Maar het kan dus met union? Zou iemand de query voor dit voorbeeld in elkaar kunnen zetten? Dat zou in ieder geval wel heel fijn zijn!

Alvast bedankt,
Stijn
 
Joren de Wit

Joren de Wit

21/01/2008 23:26:00
Quote Anchor link
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
15
16
SELECT
    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
 
Jan Koehoorn

Jan Koehoorn

21/01/2008 23:30:00
Quote Anchor link
Dat moet je ff uittesten. Je moet iets hebben als:

(
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 ;)
 
Joren de Wit

Joren de Wit

21/01/2008 23:38:00
Quote Anchor link
Jan Koehoorn schreef op 21.01.2008 23:30:
waar je die ORDER BY dan precies moet plaatsen kan ik uit mijn hoofd niet zeggen.
Die mag gewoon aan het einde van de query :-)
 
S van Lussel

S van Lussel

21/01/2008 23:43:00
Quote Anchor link
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!
 
Robert Deiman

Robert Deiman

21/01/2008 23:53:00
Quote Anchor link
@Hipska

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.
 
Jan Koehoorn

Jan Koehoorn

21/01/2008 23:53:00
Quote Anchor link
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.
 
Frank -

Frank -

21/01/2008 23:57:00
Quote Anchor link
Je kunt met een hele vieze substring en wat concat-constructies een 'datum' aanmaken en daar dan op gaan sorteren in SQL. Het werkt, maar ga niet met EXPLAIN achterhalen wat de performance is, die is om te janken!

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.
 
Jan Koehoorn

Jan Koehoorn

22/01/2008 00:05:00
Quote Anchor link
Zoiets (niet getest):
SELECT CONCAT(SUBSTR(veld, 7, 4), '-', SUBSTR(veld, 4, 2), '-',SUBSTR(veld, 1, 2)) AS nieuwe_datum
 
Frank -

Frank -

22/01/2008 00:20:00
Quote Anchor link
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.
 



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.