Meerdere tabellen ordenen bij 2 data

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Harmen

Harmen

27/02/2008 13:13:00
Quote Anchor link
Hallo,
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?
 
PHP hulp

PHP hulp

21/11/2024 15:11:32
 
Joren de Wit

Joren de Wit

27/02/2008 17:03:00
Quote Anchor link
Je gebruikt de UNION nu op een verkeerde manier. Sterker nog, in feite heb je een UNION bijna nooit nodig in een correct datamodel...

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
 
Harmen

Harmen

27/02/2008 19:08:00
Quote Anchor link
Er is geen onderlinge relatie... Dat heb ik hier helemaal niet nodig ja. Ik wil gewoon recente gebeurtenissen op m'n website zien. Wat ik wil is dit:

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?
 
Joren de Wit

Joren de Wit

27/02/2008 19:25:00
Quote Anchor link
Een UNION vereist dat je uit beide tabellen kolommen selecteert die precies dezelfde data bevatten, het selecteren van verschillende kolommen gaat niet werken.

Maar stel dat al die tabellen dus bijvoorbeeld een datumtijdstempel hebben, zou je het op de volgende manier aan kunnen pakken:
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
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

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.
 
Harmen

Harmen

27/02/2008 19:32:00
Quote Anchor link
Dat snap ik.. ik ga niet in elke tabel een nieuwe kolom toevoegen met type ofzo, ik wil gewoon in 1 keer kunnen zien als het een gebruiker, een reactie of een blog is die nieuw is.
Want uiteindelijk selecteer je nu iets dat altijd anders is hè. Ik wil zegmaar dat dit wordt uitgepoept door sql:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
id  - type - tijd
#  - blog - 2008-02-27 12:00:45
#  - user - 2008-02-27 11:49:11
(...)

als je 'user' AS type gaat selecteren, wat wil jij dat dat user is?
 
Joren de Wit

Joren de Wit

27/02/2008 19:36:00
Quote Anchor link
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...
 
Frank -

Frank -

27/02/2008 19:46:00
Quote Anchor link
Per tabel een aparte query en klaar is kees:
SELECT MAX(datumtijd), kolomnaam FROM blog GROUP BY kolomnaam;
SELECT MAX(datumtijd), kolomnaam FROM user GROUP BY kolomnaam;
etc. etc. etc.
 
Harmen

Harmen

27/02/2008 19:47:00
Quote Anchor link
Bedankt.. nu snap ik het pas ;)

Edit:

@Frank, ik denk dat het ook wel gewoon met UNION kan, toch?
Gewijzigd op 01/01/1970 01:00:00 door Harmen
 
Joren de Wit

Joren de Wit

27/02/2008 19:57:00
Quote Anchor link
@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.
 
Harmen

Harmen

27/02/2008 19:58:00
Quote Anchor link
en dat kan alleen door UNION lijkt mij...
 
Joren de Wit

Joren de Wit

27/02/2008 20:01:00
Quote Anchor link
Harmen schreef op 27.02.2008 19:58:
en dat kan alleen door UNION lijkt mij...
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.

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 ;-)
 
Harmen

Harmen

27/02/2008 20:17:00
Quote Anchor link
Okee, heel erg bedankt!
 
Joren de Wit

Joren de Wit

27/02/2008 20:22:00
Quote Anchor link
You're welcome ;-)
 
Frank -

Frank -

27/02/2008 20:35:00
Quote Anchor link
Blanche schreef op 27.02.2008 20:01:
Harmen schreef op 27.02.2008 19:58:
en dat kan alleen door UNION lijkt mij...
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.

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... ;)

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 -
 
Joren de Wit

Joren de Wit

27/02/2008 20:42:00
Quote Anchor link
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.
 
Frank -

Frank -

27/02/2008 20:52:00
Quote Anchor link
Inderdaad, voor de PHP-programmeur is het aanroepen van 1 stored procedure een heel stuk eenvoudiger dan het aanmaken van een temp-table, deze vullen met gegevens uit diverse tabellen met diverse queries en vervolgs de temp-table nog eens raadplegen. Voor de DBA is het wat meer werk, nu mag hij een SP gaan bouwen... Geen moeilijk gevalletje, maar toch.

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.
 
Harmen

Harmen

27/02/2008 21:22:00
Quote Anchor link
Nogmaals bedankt, handig dat ik weer wat meer begrippen ken trouwens ^^ Ik kijk er nu meteen even naar
 



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.