[SQL] Laatste reacties

Pagina: 1
Acties:

  • Dennis van der Stelt
  • Registratie: Januari 2000
  • Laatst online: 22:47
Ik heb een vraag... Ik wil graag op mijn site een lijst met newsitems laten zien, waarop het laatste gereageerd is. Uiteraard mag elk nieuwsitem maar één maar in de lijst staan. Tweakers.net en Fokzine.net hebben precies hetzelfde.

Nu heb ik uiteraard TFS gebruikt, en daarin loopt iedereen te schelden dat niemand SQL begrijpt, maar ik heb nog niet één maal het juiste antwoord gevonden. Grappig is dat.

Anyway, laten we ons beperken tot de reacties tabel.
code:
1
2
3
4
5
6
7
Reacties
----------
ID (uniek id)
fkNewsID (foreign key naar het nieuws)
fkUserID (foreign key naar poster van de reactie)
Posted (datum van plaatsing)
Reactie (reactie zelf)


Nu kan ik géén distinct of een group by gebruiken, want userid en id en weet ik wat nog meer is allemaal niet uniek, terwijl ik die wel moet gebruiken.

Volgens mij moet ik met een sub query eerst de unieke id's van de reacties ophalen en kan ik daarna die id's in een subselect gooien bij de normale select.
Uiteraard leg ik nog een aantal joins om username en news.topic op te halen enzo, maar dat boeit hier toch niet.

Als IEMAND mij kan helpen, ben ik hem/haar zéér erkentelijk! :+

Doe maar gewoon, dan doe je al gek genoeg.


  • Johnny
  • Registratie: December 2001
  • Laatst online: 22-05 10:01

Johnny

ondergewaardeerde internetguru

Je kunt toch de DISTINCT fkNewsID nemen? Op die manier wordt niet meerdere malen hetzelfde bericht in de lijst gezet.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Folkert
  • Registratie: September 2001
  • Laatst online: 18:32
Je hebt toch een fkNewsID? Ik neem aan dat na een reactie in het nieuwe record de fkNewsId komt te staan van het nieuws item waarop is gereageerd.
Waarom gooi je daar geen 'distinct' op waarna je ze groepeert of 'order by' ID desc of order by Posted... oid.

ai weer te laat! ;)

[ Voor 10% gewijzigd door Folkert op 01-06-2003 10:47 ]


Verwijderd

Kan je niet met Max gaan werken?

Dus zoiets als:

Select Max(Posted), ID, Reactie
From Reacties
Where bladiebla
Order By Posted

Verwijderd

dvdstelt schreef op 01 juni 2003 @ 10:34:Volgens mij moet ik met een sub query eerst de unieke id's van de reacties ophalen en kan ik daarna die id's in een subselect gooien bij de normale select.:+
Dus zoiets als?

select nieuwsbericht_velden from Nieuws
where ID in (
select nieuwsID from Reacties where Posted >= GETDATE()-3
)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:24

gorgi_19

Kruimeltjes zijn weer op :9

Je vergelijkt met FOK en met Tweakers frontpage. Deze hebben alleen de laatste x reacties.

Ze letten alleen op het nieuws en de datum; userID wordt er niet bijgenomen en het lijkt me ook een ramp om hier wel rekening mee te moeten houden.

Met deze info wordt de query ineens een stuk eenvoudiger; je hebt geen subselects nodig en een simpele inner join is dan voldoende, een max op datum en een order by op deze geaggregeerde functie, aflopend gesorteerd.

Verder mag je je cynisme voortaan wel bij je houden.

[ Voor 41% gewijzigd door gorgi_19 op 01-06-2003 11:08 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Dennis van der Stelt
  • Registratie: Januari 2000
  • Laatst online: 22:47
gorgi_19 schreef op 01 June 2003 @ 11:06:
Je vergelijkt met FOK en met Tweakers frontpage. Deze hebben alleen de laatste x reacties.

Ze letten alleen op het nieuws en de datum; userID wordt er niet bijgenomen en het lijkt me ook een ramp om hier wel rekening mee te moeten houden.

Met deze info wordt de query ineens een stuk eenvoudiger; je hebt geen subselects nodig en een simpele inner join is dan voldoende, een max op datum en een order by op deze geaggregeerde functie, aflopend gesorteerd.

Verder mag je je cynisme voortaan wel bij je houden.
Over dat cynisme, je hebt volkomen gelijk. Maar het was gisteren enórm warm en ik zat me ook te irriteren aan Microsoft. Ik kwam een bug in ASP.NET tegen en die was in .NET 1.0 al opgelost met een fix, maar in 1.1 was hij weer terug. Probleem was dat de bug niet te downloaden was, maar alleen door MS op te bellen en... blah blah blah...

Niet goed te praten dat ik zo geïrriteerd deed! Sorry! 8)7

Anyway, wat jullie voorschrijven werkt helaas niet.
Het probleem is namelijk, dat een nieuwsbericht meerdere malen voor kan komen en dat is dus juist niet de bedoeling. Dat gebeurt op tweakers en fokzine ook niet.

En met DISTINCT en GROUP BY en weet ik al wat meer, moet je _alle_ velden opgeven, waardoor het niet meer uniek wordt. Ik heb het een keer opgelost, maar die query is helaas kwijt! :'(

code:
1
2
3
4
ID     fkNewsID     fkUserID     Posted     Reactie
1      10           100          1-1-2002   a
2      10           101          1-2-2002   b
3      11           101          2-2-2002   c


Hierboven een voorbeeld van data. Probleem is, dat ID=1 eruit gefilterd moet worden. Die heeft nl. ook fkNewsID=10 en die mag niet 2x voorkomen.

code:
1
2
3
4
5
6
7
select fkNewsID, Posted
from kk
where fkNewsID in (
  select distinct fkNewsID
  from kk
  where Posted >= GETDATE() - 3
)

Zoiets zou het moeten worden. Alleen zou de sub-query niet fkNewsID moeten teruggeven. Want nu doet de 1e select nog steeds alles met fkNewsID=10 & 11 en dan komen ID 1 & 2 (en 3) toch nog terug.

Ik hoop dat jullie me nog willen helpen! _/-\o_

Doe maar gewoon, dan doe je al gek genoeg.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19:24

gorgi_19

Kruimeltjes zijn weer op :9

Je hebt nog steeds de users er bij. Aangezien er imho een rotrelatie ligt tussen deze, zou ik deze in eerste instantie dan ook buiten je query laten. Later kan je deze nog wel opzoeken

Enfin, wat ik had bedacht was de volgende query:

SQL:
1
2
3
4
SELECT Max(Reacties.Posted) AS MaxOfPosted, News.News
FROM News INNER JOIN Reacties ON News.NewsID=Reacties.fkNewsID
GROUP BY News.News
ORDER BY Max(Reacties.Posted) DESC;

Dit moet in principe hetzelfde doen als de query op de frontpage van Tweakers.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Dennis van der Stelt
  • Registratie: Januari 2000
  • Laatst online: 22:47
Hmmm, is het zó simpel???
Blijkbaar wel... Waarom makkelijk doen, als het ook moeilijk kan toch? Met meerdere subqueries enzo!

Nou ja, als je dan ook nog dit doet...
code:
1
2
3
4
SELECT Max(Reacties.Posted) AS MaxOfPosted, News.Topic, News.ID
FROM News INNER JOIN Reacties ON News.NewsID=Reacties.fkNewsID
GROUP BY News.Topic, News.ID
ORDER BY Max(Reacties.Posted) DESC;
...dan kun je ook nog 'achter' je topics een linkje maken naar direct het juiste item.

Zoals ik al zei, het was warm enzo, vandaar dat ik er niet op kwam! O-) :X

En bedankt uiteraard!!! _/-\o_ _/-\o_

[ Voor 6% gewijzigd door Dennis van der Stelt op 02-06-2003 15:04 ]

Doe maar gewoon, dan doe je al gek genoeg.


Verwijderd

Ik kan niet meer reageren op mijn eigen post, maar ik wil wel even zeggen dat het stukje code uit dit topic ook werkt voor mij. Had het via de search niet gevonden... sorrie...
Pagina: 1