Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [MySQL] unire il risultato di due query

    Ciao a tutti,
    ho questo problema e chiedo a voi esperti se potete suggerirmi un buon metodo per risolverlo..

    Ho il risultato di due query, che chiamo T1 e T2.

    T1 contiene dei segmenti, sotto forma di punto di inizio e punto di fine. Esempio:
    NOME INIZIO FINE
    Segmento1 10 15
    Segmento2 20 25
    Segmento3 40 50

    T2 contiene dei punti, sotto forma di un solo valore. Esempio:
    NOME POSIZIONE
    Punto1 7
    Punto2 45

    Vorrei ottenere un risultato in cui ho tutti i records di T1 con a fianco i punti di T2 che cadono all'interno dei segmenti di T1. Quello che non ho idea di come poter risolvere è il fatto che devo avere per forza tutti i record di T1, anche se non c'e' nessun punto in T2 che cade dentro un segmento di T1.

    Con l'esempio di prima vorrei cioè avere:

    T1.NOME T1.INIZIO T1.FINE T2.NOME T2.POSIZIONE
    Segmento1 10 15 null null
    Segmento2 20 25 null null
    Segmento3 40 50 Punto2 45


    Scusate per la domanda banale e grazie mille a chi vorrà aiutarmi

    Ciao
    alberto

  2. #2
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333

    Re: [MySQL] unire il risultato di due query

    Scusate per la domanda banale e grazie mille a chi vorrà aiutarmi
    La domanda non è banale.

    Assomiglia un po a una query a campi incrociati di Access

    Ma con MySql e MSSQL non credo si possa eseguire.




    Vorrei che qualcuno piu esperto di me desse la soluzione



  3. #3
    Grazie per la risposta. Bene, mi è capitata una bella rogna allora!
    Quindi direttamente non si può fare dici? E se provassi ad ottenerla in modo indiretto cioè una prima query che trova tutti i punti con corrispondenza, e poi una UNION con una seconda query con un "NOT IN.." dove cerco tutti i record di T1 che non erano usciti prima?

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Provo a dirti fino a dove potrei arrivare io semplicemente
    e darti delle ipotesi per arrivare in fondo.

    Tu Hai

    Segmento1 __ 10 __ 15
    Segmento2 __ 20 __ 25
    Segmento3 __ 40 __ 50

    poi hai

    Punto1 __ 7
    Punto2 __ 45
    punto3 __ 48

    __________________________________________________ __

    Puoi arrivare facilmente a:

    Segmento1 __ 10 __ 15 _______null______
    Segmento2 __ 20 __ 25 _______null______
    Segmento3 __ 40 __ 50 ____ Punto2 __ 45
    Segmento3 __ 40 __ 50 ____ Punto3 __ 48


    Con un po di difficolta puoi anche arrivare a:

    ___null___________________ Punto1 __ 7
    Segmento1 __ 10 __ 15 _______null______
    Segmento2 __ 20 __ 25 _______null______
    Segmento3 __ 40 __ 50 ____ Punto2 __ 45
    Segmento3 __ 40 __ 50 ____ Punto3 __ 48

    Fino a qui lo possiamo dare per gia fatto.

    ________________________________________________


    Dopo la tua query si deve abbassare e allargare

    significa che il segmento3 che occupa 2 record
    dovra occuparne solamente 1 spostando in fianco
    il secondo record

    Segmento3 __ 40 __ 50 ____ Punto2 __ 45 ____ Punto3 __ 48


    Questo è il classico caso della query a campi incrociati
    che con Access si fa facilmente
    con SQLServer ci sono delle limitazioni
    con MySql non sono informato ( ritengo ci siano dei limiti )

    __________________________________________________ _

    Puoi certamente accrocchiare qualcosa,
    se hai un DB MySql ti ci connetti con Access
    che con i suoi limiti ti fa quello che vuoi
    ( se non sono milioni di record )

    Poi avrai una applicazione finale che preleva i suoi dati da
    MySql e per una query da Access

    Questa è la strada che prenderei io


    Fammi sapere

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    ciao allora rifaccio un attimo il punto:
    il segmento lo definisci solo con l'ordinata iniziale e finale, se ho capito bene non te ne frega se ha un valore y per ogni punto di inizio. Lo stesso per il punto: eccoti la soluzione

    select * from t1 left join t2 on fine > posizione and inizio < posizione

    Ps i campi incrociati c'entrano poco

    ciauz

  6. #6
    Ciao a tutti,
    l'SQL è proprio bello e potente, il più è saperlo sfruttare

    Si in effetti a me basta avere tutti i segmenti di T0 con a fianco i punti di T1, e null se non ci sono punti. Se ci sono due o più punti di T1 che corrispondono ad un segmento in T0, è perfetto avere righe duplicate di T0.

    Ho provato ad applicare la soluzione proposta, adattandola perchè nel mentre si è un pò complicata: ora entramble le tabelle contengono dei segmenti, e vorrei avere l'elenco di tutti i segmenti di T0, con a fianco i segmenti di T1 che si sovrappongono (se ce ne sono, null altrimenti).

    I segmenti hanno associato anche una stringa (campo CHR), che identifica la retta su cui sono, e che mi servirebbe per incrociare solo i segmenti che stanno sulla stessa retta.

    Esempio (qui in realtà ho T1 e T2):

    SELECT T1.CHR, T1.BP_START, T1.BP_END FROM T1

    CHR BP_START BP_END
    chr1 30 60
    chr1 100 400
    chr1 800 1100
    chr1 1200 1300
    chr1 1500 1700
    chr1 1900 2000
    chr2 2 2

    SELECT T2.CHR,T2.BP_START,T2.BP_END FROM T2

    CHR BP_START BP_END
    chr1 80 200
    chr1 220 250
    chr1 500 700
    chr1 900 1000
    chr1 1100 1800


    Per tenermi solo i segmenti che ho sulla stessa retta, provo a fare:

    SELECT
    T1.CHR, T1.BP_START, T1.BP_END,
    T2.CHR, T2.BP_START, T2.BP_END
    FROM
    T1 LEFT JOIN T2 ON (T1.CHR = T2.CHR)

    ma però ottengo un sacco di records duplicati, in pratica per ogni record di T1 ottengo un record di T2.


    Inserisco anche la condizione sul fatto che voglio solo i segmenti di T2 che "overlappano" con quelli di T1:



    SELECT
    T1.CHR, T1.BP_START, T1.BP_END,
    T2.CHR, T2.BP_START, T2.BP_END
    FROM
    T1 LEFT JOIN T2 ON
    (T1.CHR = T2.CHR) AND
    ( (T2.BP_START BETWEEN T1.BP_START AND T1.BP_END) OR (T2.BP_END BETWEEN T1.BP_START AND T1.BP_END) )



    Risultato come atteso :

    CHR BP_START BP_END CHR BP_START BP_END
    chr1 30 60 NULL NULL NULL
    chr1 100 400 chr1 80 200
    chr1 100 400 chr1 220 250
    chr1 800 1100 chr1 900 1000
    chr1 800 1100 chr1 1100 1800
    chr1 1200 1300 NULL NULL NULL
    chr1 1500 1700 NULL NULL NULL
    chr1 1900 2000 NULL NULL NULL
    chr2 2 4 NULL NULL NULL


    Secondo voi va bene come ho scritto la query?


    Se ora volessi aggiungere anche la distanza tra ciascun segmento di T1 con quello più vicino che sta in un'altra tabella T3, cosa mi suggerite? Forse non si può fare...

    Es: T3 potrebbe essere del tipo

    SELECT T3.CHR,T3.BP_START,T3.BP_END FROM T3

    CHR BP_START BP_END
    chr1 750 780
    chr1 1300 1600

    Ed avrei:

    CHR BP_START BP_END CHR BP_START BP_END CHR BP_START BP_END DISTANCE
    chr1 30 60 NULL NULL NULL chr1 750 780 720 (cioè 750-30)
    chr1 100 400 chr1 80 200 chr1 750 780 650 (cioè 750-100)
    chr1 100 400 chr1 220 250 chr1 750 780 650 (cioè 750-100)
    chr1 800 1100 chr1 900 1000 chr1 750 780 -80 (cioè 750-800)
    chr1 800 1100 chr1 1100 1800 chr1 750 780 -80 (cioè 750-800)
    chr1 1200 1300 NULL NULL NULL chr1 1300 1600 0 (cioè 1300-1300)
    chr1 1500 1700 NULL NULL NULL chr1 1300 1600 -200 (cioè 1300-1500)
    chr1 1900 2000 NULL NULL NULL chr1 1300 1600 -600 (cioè 1300-1900)
    chr2 2 4 NULL NULL NULL NULL NULL NULL NULL

    Grazie mille per tutto!
    Ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    268
    la query ad occhi mi sembra che funzioni, tieni conto che non è buona regola costruire resultset disomogeni con una sola query. Piuttosto scrivi un po di codice così da ottimizzare i risultati e poter aggregare e filtrare meglio i dati.
    Un ultima cosa, le tabelle dei segmenti, punti ecc. sono costruite un po male, cerca di disegnare il problema globale e poi costruisci le tabelle, se costruisci le tabelle colonna per colonna non risolvi un gran chè

    Ciao

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.