Meerdere tabellen ordenen bij 2 data
ik heb meerdere tabellen, nu nog 2 om wat te testen, en die wil ik allebei in 1 query laten selecteren op de datum. Op die manier zou ik dan de laatste gebeurtenissen op de website kunnen zien in een adminpaneel. Ik ben nu zover, maar dit is niet echt wat ik wil:
http://phphulp.pastebin.com/meb73351
Ordenen lukt prima, maar ik kan niet meer zien als het nou een nieuwe blog is, of dat het een nieuwe gebruiker is. Kan ik die queries ook nog een waarde meegeven als het een blog of een user is?
Als je in 1 query wilt selecteren uit meerdere tabellen, zal er een onderlinge relatie tussen deze tabellen moeten zijn. In de query gebruik je dan een JOIN om deze relatie aan te geven. Is er geen relatie, dan zijn het dus twee aparte vragen en heb je twee aparte queries nodi.g
10 minuten geleden: blog # toegevoegd
12 minuten geleden: user # geregistreerd
25 minuten geleden: reactie op # geplaatst
30 minuten geleden: user # geregistreerd
etc etc
Dan heb je helemaal geen onderlinge relatie nodig...
Heeft iemand misschien een idee hoe ik het op bovenstaande manier kan selecteren?
Maar stel dat al die tabellen dus bijvoorbeeld een datumtijdstempel hebben, zou je het op de volgende manier aan kunnen pakken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT
datumtijdveld,
'blog' AS type
FROM
blogs
UNION
SELECT
datumtijdveld,
'reactie' AS type
FROM
reacties
UNION
SELECT
datumtijdveld,
'user' AS type
FROM
users
ORDER BY
datumtijdveld DESC
datumtijdveld,
'blog' AS type
FROM
blogs
UNION
SELECT
datumtijdveld,
'reactie' AS type
FROM
reacties
UNION
SELECT
datumtijdveld,
'user' AS type
FROM
users
ORDER BY
datumtijdveld DESC
Deze query is niet getest, maar ik verwacht dat zoiets wel zou moeten werken. Wat je in feit doet is uit alle tabellen de datumtijdstempel en een string, die het type aangeeft, selecteren. Vervolgens sorteer je de geselecteerde records op de datumtijdstempel.
Want uiteindelijk selecteer je nu iets dat altijd anders is hè. Ik wil zegmaar dat dit wordt uitgepoept door sql:
als je 'user' AS type gaat selecteren, wat wil jij dat dat user is?
Dat 'user', 'reactie' en 'blog' zijn gewoon simpele strings die aangeven wat het type van het record is (lees: uit welke tabel het record komt). Deze gegevens hoeven uiteraard niet in de tabel zelf te staan, enkel in je query. Vandaar ook dat je ze een alias geeft om zo net te doen alsof het een kolom is...
SELECT MAX(datumtijd), kolomnaam FROM blog GROUP BY kolomnaam;
SELECT MAX(datumtijd), kolomnaam FROM user GROUP BY kolomnaam;
etc. etc. etc.
Edit:
@Frank, ik denk dat het ook wel gewoon met UNION kan, toch?
@Frank, ik denk dat het ook wel gewoon met UNION kan, toch?
Gewijzigd op 01/01/1970 01:00:00 door Harmen
@Frank: als je een overzicht van de laatste 10 events wilt, zal die oplossing niet werken. Op een of andere manier zul je de records uit de verschillende tabellen samen moeten nemen en sorteren op datum.
en dat kan alleen door UNION lijkt mij...
Harmen schreef op 27.02.2008 19:58:
Er zijn nog wel meer manieren hoor. Denk bijvoorbeeld aan een tempory tabel waarin je deze records wegschrijft of een stored procedures die een set van deze records retourneert.en dat kan alleen door UNION lijkt mij...
UNION is zeker niet de enige oplossing en waarschijnlijk ook niet de meest efficiente en schaalbare. Het werkt, maar daar is dan waarschijnlijk ook het meeste wel mee gezegd ;-)
Okee, heel erg bedankt!
You're welcome ;-)
Blanche schreef op 27.02.2008 20:01:
UNION is zeker niet de enige oplossing en waarschijnlijk ook niet de meest efficiente en schaalbare. Het werkt, maar daar is dan waarschijnlijk ook het meeste wel mee gezegd ;-)
Inderdaad, een temporary table is hier de aangewezen kandidaat voor. Dat was ook de gedachte die ik er bij had toen ik een reactie inklopte. Had het er alleen niet bijgezet, het lag voor mij iets te veel voor de hand... ;)Harmen schreef op 27.02.2008 19:58:
Er zijn nog wel meer manieren hoor. Denk bijvoorbeeld aan een tempory tabel waarin je deze records wegschrijft of een stored procedures die een set van deze records retourneert.en dat kan alleen door UNION lijkt mij...
UNION is zeker niet de enige oplossing en waarschijnlijk ook niet de meest efficiente en schaalbare. Het werkt, maar daar is dan waarschijnlijk ook het meeste wel mee gezegd ;-)
Succes!
Ps. Een stored procedure kan ook, maar dat is niet meer dan een stuk verpakking om dezelfde opzet: een temp-table die je vult met een aantal MAX()-queries.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Voordeel van een SP is dan weer dat je maar 1 query nodig hebt terwijl je er met een temporary table altijd meerdere nodig zult hebben. Kwestie van waar je de verwerking van de gegevens wilt uitvoeren, in de database of in PHP.
Al moet ik zeggen dat ik nauwelijks ervaring heb met het bouwen van SP's in MySQL en ik vrees dat we het daar over hebben. Werkt ook pas sinds versie 5.
Nogmaals bedankt, handig dat ik weer wat meer begrippen ken trouwens ^^ Ik kijk er nu meteen even naar