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

    [Mysql] Ottenere l'intersezione di due query

    Io ho queste due query, è possibile creare una terza query che dia come risultato l'intersezione tra queste due senza che i dati si ripetano?
    (Tenuto conto che le relazione tra le tabelle Fonti e le altre è di uno a molti)

    codice:
    SELECT `Fonti`.`ID`, `Fonti`.`Titolo`, `Fonti`.`formato`, `Fonti`.`Anno`, GROUP_CONCAT( `Parole_chiave`.`keyword` ORDER BY `Parole_chiave`.`keyword` ASC SEPARATOR ', ')
    
    FROM `Fonti`
    
    INNER JOIN `Assegnazione_parole_chiave` ON `Fonti`.`ID` = `Assegnazione_parole_chiave`.`fonteid`
    INNER JOIN `Parole_chiave` ON `Parole_chiave`.`ID` = `Assegnazione_parole_chiave`.`keywordid`
    INNER JOIN `Autori` ON (`Autori`.`ID` = `Fonti`.`autore_2id` OR `Autori`.`ID` = `Fonti`.`autore_1id`)
    
    WHERE ( 1 
            AND (`Fonti`.`Titolo` LIKE '%CRISM%')
            AND (`Fonti`.`Anno` < 2010) 
            AND (`Fonti`.`Anno` > 2000)
            AND (`Autori`.`ID` IN (75, 1))
           )
    GROUP BY `Fonti`.`ID`
    codice:
    SELECT `Fonti`.`ID`, `Fonti`.`Titolo`, `Fonti`.`formato`, `Fonti`.`Anno`, GROUP_CONCAT( `Autori`.`Nome_Autore` ORDER BY `Fonti`.`autore_1id` SEPARATOR ', ')
    
    FROM `Fonti`
    
    INNER JOIN `Autori` ON (`Autori`.`ID` = `Fonti`.`autore_2id` OR `Autori`.`ID` = `Fonti`.`autore_1id`)
    INNER JOIN `Assegnazione_parole_chiave` ON `Fonti`.`ID` = `Assegnazione_parole_chiave`.`fonteid`
    
    WHERE ( 1 AND (`Assegnazione_parole_chiave`.`keywordid` IN (75, 123)) )
    
    GROUP BY `Fonti`.`ID`

  2. #2

  3. #3
    Tratto dal link che mi hai dato:

    codice:
     SELECT member_id, name FROM a
     INTERSECT
     SELECT member_id, name FROM b
    can simply be rewritten to
    codice:
     SELECT a.member_id, a.name
     FROM a INNER JOIN b
     USING (member_id, name)

    Se ho capito bene questo si può fare se si devono intersecare i dati di due tabelle diverse ma che hanno le colonne con lo stesso nome... che non è il mio caso...

    oppure sono io che non ho capito???

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Non è necessario che le colonne abbiano lo stesso nome. Anzichè ricorrere alla scorciatoia di using espliciti il join coi rispettivi nomi.

  5. #5
    ????Sì è quello che ho tentato di fare... ma il problema rimane...
    Probabilmente sono io che non capisco... anche perché è il primo database con cui ho a che fare...

    Allora Faccio un passo indietro:

    Mi spiego con il classico esempio dei libri(che è molto simile al mio)

    Ci sono 4 Tabelle:

    Tabella Libri con le colonne ID, Titolo, Autore1_ID, Autore2_ID (+ altre informazioni)
    Tabella Autori con la colonna ID, Nome_autore
    Tabella Categorie con la colonna ID, Nome_categoria
    Tabella Assegna_Categorie con la colonna Libro_ID, Nome_categoria_ID

    Quello che cercavo di fare è una query di "ricerca"
    che mi restituisca Titolo, entrambi gli Autori, tutte le categorie a cui quel libro appartiene
    senza però creare duplicati di ID (cioè non voglio che un ID compaia due volte una volta con una categoria ed un'altra volta con l'altra...)

    Credo che il problema è che mentre tutte le altre informazioni le posso inserire in WHERE con un semplice AND
    per l'autore e la categoria è differente
    infatti ho bisogno di estrarre tutte le categorie del libro purché almeno una sia quella che gli ho dato

    es se libro 1 -->giallo, fantasy
    libro 2 -->giallo, storico
    libro 3 -->storico
    libro 4 -->storico, rosa
    libro 5 -->giallo

    Se mi interessano i gialli. La query mi dovrebbe permettere di estrarre il libro 1,2 e 5
    e per il libro 1 mi dovrebbe estrarre anche che appartiene alla categoria fantasy e per il 2 che appartiene alla categoria storico... e lo stesso con gli autori

    Per far questo ho usato GROUP_CONCAT(), ma riesco ad estrarre o gli autori o le categorie

    perché quando tento di inserirli entrambi mi estrae due volte lo stesso libri.ID

    COME POSSO FARE PER AVERNE UNO SOLO?

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da sea_green
    Tabella Libri con le colonne ID, Titolo, Autore1_ID, Autore2_ID (+ altre informazioni)
    La tabella libri non la organizzerei così.
    E' una relazione molti a molti. Uno scrittore può aver scritto più libri così come un libro può essere scritto da X autori.

    Ti posto un esempio ridotto ai minimi termini che mi sembra soddisfi la tua richiesta.

    codice:
    create table autori (
    id_autore int unsigned not null auto_increment,
    nome varchar(100),
    cognome varchar(100),
    primary key (id_autore)
    );
    
    insert into autori (nome,cognome) values ('Mario','Rossi'),('Andrea','Bianchi'),('Giovanni','Verdi'),('Stefano','Gialli');
    
    
    create table libri (
    id_libro int unsigned not null auto_increment,
    titolo varchar(100),
    primary key (id_libro)
    );
    
    insert into libri (titolo) values ('Testo 1'),('Testo 2'),('Testo 3'),('Testo 4'),('Testo 5');
    
    
    create table libri_autori (
    id int unsigned not null auto_increment,
    id_libro int,
    id_autore int,
    primary key (id)
    );
    
    insert into libri_autori (id_libro,id_autore) values (1,1),(2,2),(2,3),(3,1),(3,2),(4,2),(5,1),(5,2),(5,3);
    
    create table categorie (
    id_categoria int not null auto_increment,
    categoria varchar(50),
    primary key (id_categoria)
    );
    
    insert into categorie (categoria) values ('giallo'),('fantasy'),('storico'),('rosa');
    
    create table libri_categorie (
    id int not null auto_increment,
    id_libro int,
    id_categoria int,
    primary key (id)
    );
    
    insert into libri_categorie (id_libro,id_categoria) values (1,1),(1,2),(2,1),(2,2),(3,3),(4,3),(4,4),(5,1);
    
    
    select 
    la.id_libro,
    l.titolo,
    group_concat(distinct concat_ws(' ',a.cognome,a.nome) order by a.cognome,a.nome ) as autori,
    group_concat(distinct c.categoria) as categorie
    from libri_autori as la
    inner join autori as a on la.id_autore = a.id_autore
    inner join libri as l on la.id_libro = l.id_libro
    inner join libri_categorie as lc on lc.id_libro = l.id_libro
    inner join categorie as c on lc.id_categoria = c.id_categoria
    group by l.id_libro
    having find_in_set('giallo',categorie)

  7. #7
    Grazie adesso provo! Poi ti faccio sapere!

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.