• User

    Problema con query MySql complessa

    Premessa:
    devo costruire una tabella 100x100 rappresentante il mondo.
    Totale=100.000 caselle. Ogni casella ha x e y.
    In una ventina di caselle ci sono dei giocatori con delle colonie.(in una casella ci può essere più di una colonia)

    Ho creato una tabella mondo
    CREATE TABLE mondo (
    id int(11) NOT NULL auto_increment,
    isola varchar(255) default NULL,
    x int(2) default NULL,
    y int(2) default NULL,
    mare enum('y','n') NOT NULL default 'y',
    PRIMARY KEY (id)
    ) ;

    che descrive ogni casella.

    Ho creato una tabella colonie e una players.
    CREATE TABLE players (
    id int(11) NOT NULL auto_increment,
    nome varchar(255) NOT NULL,
    alleato enum('y','n') default 'n',
    PRIMARY KEY (id)
    )

    CREATE TABLE colonie (
    id int(11) NOT NULL auto_increment,
    idPlayer int(11) NOT NULL,
    idIsola int(11) NOT NULL,
    citta varchar(255) default NULL,
    PRIMARY KEY (id)
    )

    Fine premessa.
    Io ho la necessità di disegnare il mondo e mi serve una query che mi tiri fuori tutte le caselle del mondo e mi dica se in quella casella c'è una colonia oppure no.

    Partendo dal presupposto che non posso fare una seconda query per ogni casella altrimenti farei 100.001 query per disegnare il tabellone, ho provato a incasellarmi tutte le colonie in un array.
    Faccio una query che mi da le coordinate del mondo e per ogni riga(cioè casella) faccio un match con le coordinate memorizzate nell'array, ma è troppo lento e per niente performante.

    Morale mi serve una query che mi tiri fuori tutte le caselle con relative coordinate e mi dica se in quella casella ci sono delle colonie.

    Se qualcuno riesce a darmi una mano gliene sarò riconoscente.
    Per la cronaca questo dovrebbe diventare un tool per il gioco online Ikariam.

    Grazie
    Brucee


  • Bannato User Attivo

    non si capiscono le relazioni fra le tre tabelle, potresti dettagliarle?


  • User

    Si scusate, ecco le relazioni

    mondo.id=colonie.idIsola
    colonie.idPlayer=players.id


  • Bannato User Attivo

    select *
    from mondo
    left join colonie
    on( mondo.id=colonie.idIsola )
    left join players
    on( colonie.idPlayer=players.id )

    da testare.


  • User

    Mi sa che funziona.
    Non conosco l'utilizzo di "ON" sul left join, sarà meglio che me lo studi.
    Grazie mille, mi perfeziono lo script, poi se volete lo pubblico anche per gli altri.