Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Unieke rijen

Pagina: 1
Acties:

  • BlackWhizz
  • Registratie: September 2004
  • Laatst online: 29-11 21:31
Oke, heel vaag. Ik ben dus een topic tracker aan het maken en ik wil geen dubbele topics. Dus distinct gebruikt:

code:
1
2
$qReact = 'SELECT DISTINCT(`tid`), naam, tijd FROM forum_replys ORDER BY tijd DESC LIMIT 5';
$sReact = mysql_query($qReact) or die( mysql_error() );


Maar hij maakt helemaal geen gebruik van die distinct. Ik krijg nog steeds dubbele topics :S Ik heb ook al geprobeerd DISTINCT `tid` en DISTINCT tid maar het werkt allemaal niet :S

Kijk ik nou over mijn fout heen of klopt er echt iets niet.

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Bekijk deze topics eens (gevonden via zoeken op DISTINCT werkt niet).

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Sja, dat klopt. In het eerste geval doet je distinct eigenlijk niks, want er is maar 1 record per keer om te bekijken, in het tweede geval doe je distinct over de combinatie tid, naam en tijd en ik gok dat minimaal die tijd voor elke reactie wel zo'n beetje anders is.

MySQL biedt niet echt een eenvoudige oplossing hiervoor, maar als je die naam weg kan laten, dan zou je zoiets kunnen doen:
SELECT tid, MAX(tijd) as tijd FROM ... GROUP BY tid ORDER BY tijd DESC LIMIT 5

Of als je die naam er wel bij wilt kan je nog zoiets proberen:
SQL:
1
2
3
4
SELECT r.tid, r.naam, r.tijd FROM forum_replyes
JOIN (SELECT tid, MAX(tijd) as tijd FROM forum_replys r
      GROUP BY tid ORDER BY tijd DESC LIMIT 5) as tt ON tt.tid = r.tid AND tt.tijd = r.tijd
ORDER BY r.tijd DESC


Maar ik garandeer je niet dat het goed of snel werkt :P

  • BlackWhizz
  • Registratie: September 2004
  • Laatst online: 29-11 21:31
Oke, weird. Als ik de query van mij vergelijk met die in jouw tweede topic (deze topics) komen er nog steeds dubbele records uit.

code:
1
2
3
4
5
6
7
8
9
10
qReact = 'SELECT tid, naam, tijd 
FROM forum_replys 
WHERE tid IN ( 
    SELECT MAX(id) 
    FROM forum_replys 
    GROUP BY naam
) 
ORDER BY tijd DESC 
LIMIT 5';
$sReact = mysql_query($qReact) or die( mysql_error() );


Boven me, ik ga ff proberen met jouw query. Alvast bedankt :)
Helaas, deze query geeft een fout die ik niet kan oplossen.

Edit3:
Ik heb de onopvallende (de eerste) query gebruikt. Die werkt wel.

[ Voor 21% gewijzigd door BlackWhizz op 16-10-2007 08:59 ]


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

een distinct werkt over de gehele record. Je records worden dus ontdubbelt op alle velden welke in je select staan. Distinct op een enkel veld (als aggregate functie ( distinct(fieldname) ) is alleen bruikbaar in een group by.

Maar misschien moet je een andere vraag stellen. Als er al miljoenen forums in PHP en MySQL zijn geschreven en het werkt niet bij mij, doe ik dan misschien iets fout? Wat er niet klopt is jouw query.

Maar alleen je vraagstelling en query botsen al met elkaar. Je zegt dat dat je geen dubbele topics wilt aanmaken. Waarom is de naam en tijd dan van belang? En weet je wel zeker dat je geen dubbele topic wilt? Wat als 6 maanden gelezen een topic met dezelfde naam al is gesloten?

Mijn advies: Bekijk (de broncode van ) een aantal bestaande topic trackers en bepaal welke onderdelen je anders zou doen. Bekijk ook hoe zij bepaalde oplossingen implementeren zoals dubbele topics. Als je besluit het wiel opnieuw uit te vinden, kijk dan ook eens bij je buurman hoe die problemen oplost..

If it isn't broken, fix it until it is..


  • BlackWhizz
  • Registratie: September 2004
  • Laatst online: 29-11 21:31
Bedankt voor de uitleg Niemand_Anders. Ik ga meestal googlen, maar dit is een goede tip :) Dan kan ik de volgende keer verder kijken naar info.
Pagina: 1