Svish Skrevet 9. november 2007 Del Skrevet 9. november 2007 (endret) Jeg driver å lager en enkel bittorrent tracker side. Fant en meget ok enkel php tracker, som ser ut til å fungere ypperlig. Den bruker en table hvor den dytter inn peers som announcer. For websiden har jeg laget et table i tillegg som inneholder selve torrentfilene som jeg laster opp. Begge tables har primær nøkkel info_hash. Denne kalkuleres fra torrent fila i det ene tilfellet, og gis av den enkelte peer i det andre (som også kalkulerer den fra torrent fila). Så de er den samme hvis det er snakk om samme torrent. På websiden så lister jeg opp hvilke torrents som finnes i torrent table. Det jeg lurer på er hvordan jeg effektivt kan finne ut hvor mange seeds og leechers det er. Kan gjøre to/tre queries, først finne torrent, og så bruke info_hash til å finne ut hvor mange peers det er i den andre som holder på med denne torrenten. Peer table har et felt som heter 'left', og dersom den er 0, så har du en see. dersom den ikke er det har du en leech. Altså, hvordan kan jeg få dyttet inn i min standard select fra torrent to verdier med totalt antall aktive på torrenten det gjelder, og hvor mange av de som er seeds? Snakk om MySQL database forøvrig. Og queriet jeg bruker for å finne torrents til websiden er så her: SELECT t.info_hash_hex, t.title, t.summary, t.length, t.updated_at FROM torrent t, peer p ORDER BY t.updated_at DESC Det jeg gjerne skulle hatt var altså en listing av hvor mange rader i peer som har samme info_hash som torrent raden, samt hvor mange av de radene i peer som har left = 0. Og som sagt kan jeg fint gjøre dette i flere omganger. Først hente alle torrents, og så kjøre ny spørring for hver torrent. Men det er jo ikke spesielt effektivt... Og jeg vet det er lurere måter å gjøre de på. I want to learn Endret 9. november 2007 av Tussi_qwerty Lenke til kommentar
roac Skrevet 9. november 2007 Del Skrevet 9. november 2007 For det første: ... FROM torrent t {inner/left/outer} join peer p on (p.noe = t.noe) Spørringen din returnerer et kartesisk produkt (alle mot alle), noe som potensielt gir mange rader. Hvis du har 1000 rader i hver av tabellene får du et resultatsett med 10000000 rader, noe som kanskje er litt i overkant. Ellers kan du se på group by i forbindelse med en aggregering: select t.ditt, t.datt, count(p.noe) from torrent t inner join peer p on (p.torrentid = t.torrentid) group by t.ditt, t.datt Lenke til kommentar
Svish Skrevet 9. november 2007 Forfatter Del Skrevet 9. november 2007 altså, det visste jeg jo egentlig.. bare hadde ikke peer p i den originale spørringen, og bare la den til så det skulle være klart at jeg ville ha den med men takk takk. Skal se på group by. bare har ikke helt skjønt den count() saken. kan man få den til å count(felt = something) eller sånt? eller? Lenke til kommentar
roac Skrevet 9. november 2007 Del Skrevet 9. november 2007 Nope. Count teller antall rader for hver unike kombinasjon av det det gjøres order by på (alle andre felter) Lenke til kommentar
Svish Skrevet 9. november 2007 Forfatter Del Skrevet 9. november 2007 (endret) Beste jeg har funnet på til nå krever to spørringer. Om noen finner noen store ytelsesproblemer (som kan forebres, please let me know # Get torrents $r = @mysql_unbuffered_query('SELECT t.info_hash, t.info_hash_hex, t.title, t.summary, t.length, t.updated_at FROM torrent t ORDER BY t.updated_at DESC;' ); while($t = mysql_fetch_assoc($r)) { $torrent[$t['info_hash']] = $t; } # Get peer stats $r = @mysql_unbuffered_query('SELECT p.info_hash, GROUP_CONCAT(p.left) as "peers" FROM peer p GROUP BY p.info_hash;' ); while($t = mysql_fetch_assoc($r)) { $ta = explode(',', $t['peers']); foreach($ta as $p) { $p == 0 ? $torrent[$t['info_hash']]['seed']++ : $torrent[$t['info_hash']]['leech']++; } } Endret 9. november 2007 av Tussi_qwerty Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå