Archief - PHP : Probleem met complexe JOIN

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Fr3aK

Legacy Member
Eerst even wat info:

Site: http://fr3ak.zapto.org/_unfinished/forum/ (online om 11u)

Code:
forum:

| id | naam     | omschrijving | icon |
---------------------------------------
| 1  | Algemeen | Blabla       | bla  |
| 2  | Zever    | Meer bla     | bla  |

Code:
topic:

| id | fid | titel | status |
-----------------------------
| 1  | 1   | Bla   | bla    |

Code:
post:

| id | tid | uid | bericht | dag | maand | jaar | tijd  |
---------------------------------------------------------
| 1  | 1   | 1   | bla     | 5   | 8     | 2005 | 08:49 |
| 2  | 1   | 1   | bla     | 6   | 8     | 2005 | 17:23 |

Code:
user (simpele voorstelling):

| id | nickname |
-----------------
| 1  | Fr3aK    |

Dit zijn dus mijn 4 tabellen voor een forum, zoals je al kan zien bevat het forum "zever" geen berichten.
Nu heb ik al een lange query geschreven maar die geeft de forums weer met alle berichten en ik zou dus willen weten hoe je de forums selecteert met alleen hun laatste bericht. (zonder het database ontwerp te wijzigen)
Ik kan ook, nu dat hij alle berichten weergeeft, een check inbouwen via PHP maar dan gaat hij wel eerst alle records uitlezen en dan duurt het ook lang...

Hier is de query (uitlezen in PHP kan ik zelf):

PHP:
SELECT f.id, f.naam, f.omschrijving, f.icon, p.uid, p.dag, p.maand, p.jaar, p.tijd, u.nickname
FROM forum f
LEFT JOIN topic t ON (f.id = t.fid)
LEFT JOIN post p ON (t.id = p.tid)
LEFT JOIN user u ON (p.uid = u.id)
ORDER BY p.id DESC

Alvast bedankt.

killgore

Legacy Member
ook orderen op datum & limiteren op bepaald aantal ;)

waar je dus de datum in 1 unix veld steekt of zo

edit: als ik een ingebouwd forum moet maken heb ik in men topic-table altijd een extra veld dat last-post time bevat, dit wordt dan upgedate bij een nieuwe reply. Is idd ietsje zwaarder bij het posten (extra update-query), maar posten wordt veeeeeel minder gedaan als lezen (ophalen). Dit kan het wat sneller maken ;).

Fr3aK

Legacy Member
killgore zei:
ook orderen op datum & limiteren op bepaald aantal ;)

waar je dus de datum in 1 unix veld steekt of zo

edit: als ik een ingebouwd forum moet maken heb ik in men topic-table altijd een extra veld dat last-post time bevat, dit wordt dan upgedate bij een nieuwe reply. Is idd ietsje zwaarder bij het posten (extra update-query), maar posten wordt veeeeeel minder gedaan als lezen (ophalen). Dit kan het wat sneller maken ;).
Kzal dat is proberen maar als ik limit op 0, 1 dan geeft hij het forum "zever" niet meer weer eh :s

BTW: site is online nu.

EDIT: Kheb het opgelost door in de tabel forum 2 extra velden toe te voegen nl. de datum en userid van de laatste post.
Nu hoef ik maar 1 keer te joinen...

Fr3aK

Legacy Member
Kheb een nieuw probleem en omdat het toch ivm deze query is mag ik het hier wel posten.

Ik heb dus men databasestructuur aangepast en zo ziet het er nu uit:

Forum:
- id
- naam
- omschrijving
- icon

Topic:
- id
- fid
- uid
- titel
- bericht
- datum (TIMESTAMP)
- status
- last_datum (TIMESTAMP)
- last_uid

Post:
- id
- tid
- uid
- bericht
- datum (TIMESTAMP)

User:
- id
- nickname

Zoals je kan zien zijn de datums in mysql timestamp formaat (bv.: 20050810164825)
Nu wil ik het laatste bericht weergeven op men forum, na het lezen van die topic over group by heb ik dat ook zitten proberen.
Wat bij mij niet wil lukken is op datum ordenen, dus de laatste (hoogste) datum laten zien.

PHP:
SELECT f.id, f.naam, f.omschrijving, f.icon, t.last_datum, t.last_uid, u.nickname
FROM forum f
LEFT JOIN topic t ON (f.id = t.fid)
LEFT JOIN user u ON (t.last_uid = u.id)
GROUP BY t.fid
ORDER BY t.last_datum DESC
Voorbeeld op http://fr3ak.zapto.org/_unfinished/forum

Alvast bedankt.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan