Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554

    [MySQL] select annidate VS join

    Ciao a tutti, ho una soluzione troppo pesante per il problema che vi propongo sotto, quindi chiedo aiuto. Nell'esposizione volutamente semplifico le tabelle.

    tabella prodotto

    id
    regione
    provincia
    comune
    quartiere
    prezzo_da
    prezzo_a

    tabella prodotto_richiesto

    id
    regione
    provincia
    comune
    quartiere
    prezzo

    C'è una persona che vende il prodotto e popola la tabella prodotto e una persona che richiede e popola la tabella prodotto_richiesto. Ognuna di queste persone si può collegare al sistema (che sia uno che vende oppure uno che compra) e il sistema deve mostrare tutte le corrispondenze tra le richieste e le offerte, secondo delle regole che spiego sotto.
    Ogni corrispondenza è un record di una tabella così.

    tabella corrispondenze

    id
    id_prodotto
    id_richiesta

    Ovviamente se uno rimane collegato, ad esempio per 30 minuti nell'arco di questo tempo il sistema deve aggiornare le corrispondenze. Fin qui dovrebbe essere tutto chiaro.

    Affinchè la corrispondenza venga definita positiva, tra le 2 tabelle, devono coincidere:

    regione
    provincia
    comune

    e se diversi da 0 nella tabella richiesta_prodotto anche

    quartiere
    prezzo

    Se non ci fosse la condizione "se presenti nella tabella richiesta_prodotto", il tutto si risolverebbe con una select tipo:
    Codice PHP:
    select prodotto_richiesto.id,
             
    prodotto.id from prodotto_richiesto
    inner join prodotto
    on 
    (prodotto_richiesto.regione prodotto.regione and 
          
    prodotto_richiesto.provincia prodotto.provincia and 
          
    prodotto_richiesto.comune prodotto.comune
    Quindi adesso come potrei fare se sapessi usare bene Mysql?

    La soluzione pesantissima dettata dalla mia scarsa confidenza con Mysql è selezionare tutti i dati della tabella prodotto_richiesto e per ogni record verificare se c'è corispondenza con almeno uno dei record della tabella prodotto tramite una seconda select nella tabella prodotto, la debolezza evidente di questo approccio è che quando i record della tabella prodotto_richiesto diverranno ad esempio 10000 e i record della tabella prodotto diverranno 10000 la faccenda sarà molto pesante e destinata ad appesantirsi sempre di più.

    Aiuto!!
    Vivrò una vita intera e fortunatamente morirò una volta sola

  2. #2
    mi sfugge la differenza tra la tabella prodotto_richiesto e richiesta_prodotto
    e anche l'utilità di quest'ultima.

    Inoltre se crei già una tabella con le corrispondenze, perché non fai la query su quella per poi visualizzarle? :master:

  3. #3
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554
    richiesta_prodotto e prodotto_richiesto sono la stessa tabella, ho sbagliato io a scrivere, in relatà hanno dei campi diversi solo che per semplificare l'esempio le ho ridotte all'osso, a livello logico fai conto che sono una richiesta e una offerta.

    la tabella delle corrispondenze la popolo dopo che ho tovato le corrispondenze tra le due tabelle e quindi post analisi. Il nocciolo della questione è trovare le corrispondenze
    Vivrò una vita intera e fortunatamente morirò una volta sola

  4. #4
    ok, quale è il problema nella query che hai già scritto?
    per trovare la corrispondenza tra i campi di due tabelle la cosa più logica da fare è appunto la join.

    Se proprio vuoi ottimizzare, dato che i dati Regione, Provincia e Comune sono ridondanti, li puoi inserire in apposite tabelle una volta sola e nelle tue tabelle usare solo gli ID di questi dati. Tra l'altro dichiarandoli come chiavi esterne ti crea già lui gli indici, che ottimizzano quindi la tua select in join.

    Poi dato che queste corrispondenze le salverai in un apposita tabella, questa join la farai solo una tantum.

  5. #5
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554
    Originariamente inviato da skidx
    ok, quale è il problema nella query che hai già scritto?
    per trovare la corrispondenza tra i campi di due tabelle la cosa più logica da fare è appunto la join.
    select prodotto_richiesto.id,
    prodotto.id from prodotto_richiesto
    inner join prodotto
    on (prodotto_richiesto.regione = prodotto.regione and
    prodotto_richiesto.provincia = prodotto.provincia and
    prodotto_richiesto.comune = prodotto.comune)

    vale se io volessi incrociare regione, provincia e comune.

    Ma se io volessi aggiungere anche questa condizione: se diversi da 0 nella tabella prodotto_richiesto anche quartiere e prezzo devono corrispondere nella tabella prodotto?
    Vivrò una vita intera e fortunatamente morirò una volta sola

  6. #6
    Originariamente inviato da pyotrex
    select prodotto_richiesto.id,
    prodotto.id from prodotto_richiesto
    inner join prodotto
    on (prodotto_richiesto.regione = prodotto.regione and
    prodotto_richiesto.provincia = prodotto.provincia and
    prodotto_richiesto.comune = prodotto.comune)

    vale se io volessi incrociare regione, provincia e comune.

    Ma se io volessi aggiungere anche questa condizione: se diversi da 0 nella tabella prodotto_richiesto anche quartiere e prezzo devono corrispondere nella tabella prodotto?
    Aggiungi

    WHERE (prodotto_richiesto.quartiere = 0 OR prodotto_richiesto.quartiere = prodotto.quartiere) AND (prodotto_richiesto.prezzo= 0 OR prodotto_richiesto.prezzo = prodotto.prezzo)

  7. #7
    Utente di HTML.it L'avatar di pyotrex
    Registrato dal
    Feb 2003
    Messaggi
    554
    Mi sa che hai proprio ragione
    Vivrò una vita intera e fortunatamente morirò una volta sola

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.