Daarom vroeg ik of songid een numerieke waarde zou zijn. Ik gebruikt meestal is_numeric om te bepalen of de ingevoerde waarde ook daadwerkelijk numeriek is en als dat zo is voer ik het aan de query zonder de escape_string functie te gebruiken. En ik heb een vermoeden dat ik in mijn query een group by ben vergetenquote:Op zondag 8 januari 2012 23:04 schreef GlowMouse het volgende:
De oplossing van T_T is alleen daarom al niet goed omdat hij mysql_real_escape_string en intval door elkaar haalt.
Of niet, want je weet toch al dat dat precies één rij is. Je wilt juist tellen hoeveel rijen een hogere score hebben. Je functie zou dus "songRank($likes)" moeten zijn.quote:Op zondag 8 januari 2012 23:06 schreef dirkjo het volgende:
[..]
De kolom 'likes' vertelt me de positie, die kolom bevat een getal. Met COUNT ga je alle rijen tellen die `songID` '$songID' bevatten, ofniet?
Probeer het niet goed te pratenquote:Op zondag 8 januari 2012 23:07 schreef The_Terminator het volgende:
[..]
Daarom vroeg ik of songid een numerieke waarde zou zijn. Ik gebruikt meestal is_numeric om te bepalen of de ingevoerde waarde ook daadwerkelijk numeriek is en als dat zo is voer ik het aan de query zonder de escape_string functie te gebruiken. En ik heb een vermoeden dat ik in mijn query een group by ben vergeten
Maar wat gebeurd er dan als meerdere nummers hetzelfde aantal likes hebben? Dan pakt die de eerste de beste rij die het gegeven aantal likes heeft.quote:Op zondag 8 januari 2012 23:13 schreef GlowMouse het volgende:
[..]
Of niet, want je weet toch al dat dat precies één rij is. Je wilt juist tellen hoeveel rijen een hogere score hebben. Je functie zou dus "songRank($likes)" moeten zijn.
[..]
Probeer het niet goed te praten. Je stopt output van mysql_real_escape_string in een query zonder quotes om die output en dat is onveilig.
Ik probeer niets goed te pratenquote:Op zondag 8 januari 2012 23:13 schreef GlowMouse het volgende:
Probeer het niet goed te praten. Je stopt output van mysql_real_escape_string in een query zonder quotes om die output en dat is onveilig.
Heb je die vraag eens bij je eigen query gesteld?quote:Op zondag 8 januari 2012 23:23 schreef dirkjo het volgende:
[..]
Maar wat gebeurd er dan als meerdere nummers hetzelfde aantal likes hebben? Dan pakt die de eerste de beste rij die het gegeven aantal likes heeft.
Jazeker, maar als ik mijn manier gebruik garandeer ik wel dat de plek die de pagina over het nummer aangeeft gelijk is aan de plek die staat in de pagina waar de complete lijst van alle nummers staat.quote:Op zondag 8 januari 2012 23:25 schreef GlowMouse het volgende:
[..]
Heb je die vraag eens bij je eigen query gesteld?
Ik definieer de plek als 1+[het aantal songs met meer likes]. Het aantal songs met meer likes kun je met één query tellen.
Dat is niet waar, het resultaat berust op toeval.quote:Op zondag 8 januari 2012 23:27 schreef dirkjo het volgende:
[..]
Jazeker, maar als ik mijn manier gebruik garandeer ik wel dat de plek die de pagina over het nummer aangeeft gelijk is aan de plek die staat in de pagina waar de complete lijst van alle nummers staat.
quote:Op zondag 8 januari 2012 23:30 schreef dirkjo het volgende:
En dat zou het niet doen in jouw geval, of valt zoiets niet te vermijden?
quote:Op zondag 8 januari 2012 23:25 schreef GlowMouse het volgende:
[..]
Ik definieer de plek als 1+[het aantal songs met meer likes]. Het aantal songs met meer likes kun je met één query tellen.
Oke, dus (even snel) zou jouw query er ongeveer zo uitzien:quote:
1 2 3 | <?php mysql_query("SELECT COUNT(*) AS rank FROM songs WHERE likes > ". $likes. " "); ?> |
Oke, bedankt!quote:Op zondag 8 januari 2012 23:37 schreef GlowMouse het volgende:
Precies zo. Alleen dan nog eentje bij het resultaat optellen.
Veel doeltreffender.quote:Op zondag 8 januari 2012 23:40 schreef dirkjo het volgende:
[..]
Oke, bedankt!
je houdt het trouwens wel lang vol om iemand niet het antwoord te geven, maar zelf te laten maken
Er is nu alleen wel één probleempje. Ik vertelde net dat die oude query mij dezelfde waarde geeft als wanneer ik de hele lijst zou echo'en. Deze doet dat nietquote:Op zondag 8 januari 2012 23:37 schreef GlowMouse het volgende:
Precies zo. Alleen dan nog eentje bij het resultaat optellen.
Dan moet je die andere lijst aanpassen zodat hij zo wordt:quote:Op zondag 8 januari 2012 23:48 schreef dirkjo het volgende:
[..]
Er is nu alleen wel één probleempje. Ik vertelde net dat die oude query mij dezelfde waarde geeft als wanneer ik de hele lijst zou echo'en. Deze doet dat niet
En toch heb je geen garantie dat het niet verandert.quote:Je zei dat dat bij die oude query toevallig zo gebeurde, maar na een flink aantal refreshes blijft die lijst precies hetzelfde.
Je doet het nu door te selecteren op het aantal likes?quote:Op zondag 8 januari 2012 23:48 schreef dirkjo het volgende:
[..]
Er is nu alleen wel één probleempje. Ik vertelde net dat die oude query mij dezelfde waarde geeft als wanneer ik de hele lijst zou echo'en. Deze doet dat niet![]()
Je zei dat dat bij die oude query toevallig zo gebeurde, maar na een flink aantal refreshes blijft die lijst precies hetzelfde.
//edit
Deze manier geeft zelfs bij meerdere nummers dezelfde rank, terwijl dit toch echt iets is wat niet mag gebeuren![]()
1 2 3 4 5 6 7 8 | SET @rownum := 0; SELECT * FROM ( SELECT @rownum := @rownum+1 AS song_rank, likes FROM songs ORDER BY likes DESC ) AS song_score WHERE songID = " . $songID |
Ik gebruik nu de manier van GM, een paar posts terug.quote:Op zondag 8 januari 2012 23:55 schreef The_Terminator het volgende:
[..]
Je doet het nu door te selecteren op het aantal likes?
[ code verwijderd ]
Bovenstaande zou je de rank terug moeten geven adhv het songid.
Ah, ok. Ik heb mijn code zojuist wat aangepast en getest. Het functioneerd goed en geeft de positie terug adhv een gegeven songID, zoals je dat in je eerste versie had.quote:Op zondag 8 januari 2012 23:57 schreef dirkjo het volgende:
[..]
Ik gebruik nu de manier van GM, een paar posts terug.
Heldquote:Op maandag 9 januari 2012 00:02 schreef GlowMouse het volgende:
Wijzig
SELECT songID FROM songs ORDER BY `likes` DESC
in
SELECT songID FROM songs ORDER BY `likes` DESC,songID DESC
En
SELECT COUNT(*) AS rank FROM songs WHERE likes > ...
in
SELECT COUNT(*) AS rank FROM songs WHERE likes > ... OR (likes = .... ANDS songID > ....)
Dit gebruik ik nu en werkt:quote:Op maandag 9 januari 2012 00:07 schreef The_Terminator het volgende:
[..]
Ah, ok. Ik heb mijn code zojuist wat aangepast en getest. Het functioneerd goed en geeft de positie terug adhv een gegeven songID, zoals je dat in je eerste versie had.
1 2 3 | <?php $rankQuery = mysql_query("SELECT COUNT(*) AS rank FROM songs WHERE `likes` > ". $likes. " OR (`likes` = '". $likes ."' AND `songID` > ". $songID .")"); ?> |
True.quote:Op maandag 9 januari 2012 00:09 schreef GlowMouse het volgende:
maar die van mij is uiteraard sneller.
Oke, duidelijk!quote:Op maandag 9 januari 2012 21:13 schreef GlowMouse het volgende:
Dat is het inderdaad. Als jij een query zonder COUNT(*) doet dan gaan alle rijen van MySQL naar PHP zodat PHP ze kan tellen.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |