Roberts Zariņš Posted June 19, 2012 Report Share Posted June 19, 2012 (edited) Sveicināti. Netieku galā ar vienu kvēriju; novērtētu, ja varētu sniegt kādus padomus :). Table #1 id points 1 0.53 2 9.18 3 -90.11 4 -2.4 5 6.77 6 8.13 ... ... Zinot id, vajag atgriezt, kurš pēc kārtas tas ir. Līdzīgi kā komandu tops pēc punktu skaita. Un, zinot komandu, jāatgriež, kurā vietā pašreiz komanda atrodas. Tas būtu iespējams ar vienu kvēriju? Ar PHP atrast vietu pēc kārtas būtu baigais resursu overkils, jo tabula pati par sevi ir ļoti liela (20,000 ierakstu). Paldies. Edited June 19, 2012 by Roberts Zariņš Quote Link to comment Share on other sites More sharing options...
codez Posted June 20, 2012 Report Share Posted June 20, 2012 Lai iegūtu pozīciju, saskaitām, cik daudz ir tādu, kuriem punktu skaits mazāks par doto. SELECT count(*)+1 FROM sometable WHERE points<(SELECT points FROM sometable WHERE id=4) Quote Link to comment Share on other sites More sharing options...
draugz Posted June 20, 2012 Report Share Posted June 20, 2012 (edited) Neesmu drošs, bet man šķiet, ka (SELECT points FROM sometable WHERE id=4) izpildās pie katras rindas Es rakstītu šādi SELECT COUNT(*)+1 `count` FROM tabula t1 INNER JOIN tabula t2 on t2.points < t1.points WHERE t1.id = 4; Un ja vēl šis pieprasījums notiek samērā bieži ir vērts uzlikt indeksu uz points kololonas Edited June 20, 2012 by draugz Quote Link to comment Share on other sites More sharing options...
Roberts Zariņš Posted June 20, 2012 Author Report Share Posted June 20, 2012 Ā, tiešām. Laba ideja, paldies abiem :). Kaut kā nebiju aizdomājies līdz tam, ka varētu skaitīt rindas, kam ir mazāks punktu skaits. Quote Link to comment Share on other sites More sharing options...
codez Posted June 20, 2012 Report Share Posted June 20, 2012 Subkverijs tiek izpildīts katru reizi, ja viņš ir atkarīgs no pamatkverija datiem. Šijā gadījumā viņš nav un mysql optimizātors viņu izpilda vienu reizi sākumā. Indeks uz point kolonnas ir viennozīmīgi nepieciešams. Reālā gadījumā mums drošvien vajadzēs arī datus par attiecīgo id, tāpēc kveriju var pārrakstīti vienkārši šādi: SELECT *,(SELECT count(*) FROM table WHERE points<t1.points)+1 rank FROM table t1 WHERE id=4 Quote Link to comment Share on other sites More sharing options...
Nils Graustiņš Posted August 12, 2012 Report Share Posted August 12, 2012 Veiktspējas uzlabošanai es glabātu vietas datus tabulā un tos atjaunotu pie katra UPDATE un INSERT. Quote Link to comment Share on other sites More sharing options...
codez Posted August 12, 2012 Report Share Posted August 12, 2012 Veiktspējas uzlabošanai es glabātu vietas datus tabulā un tos atjaunotu pie katra UPDATE un INSERT. Pēc tava ieteikuma, ja pēdējās vietas ieguvējs pēkšņi iegūst daudz punktus un kļūst par pirmo, tad jāupdeito visi tabulas ieraksti. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.