Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    43

    Query con relazione 1 a molti... e due condizioni

    Ciao a tutti, spero che riuscirete ad aiutarmi nella scrittura di una query che mi sta facendo penare

    Allora:

    - Ho una tabella articoli. C'è il campo/chiave-primaria "idArticolo" e altri campi di secondaria importanza (tipo data inserimento ecc.).

    - Nella seconda tabella (titoli) ho i titoli dei relativi articoli. C'è di nuovo la colonna idArticolo, per legare la prima alla seconda, il titolo vero e proprio, e la lingua (infatti ogni articolo può avere più di un titolo, in lingue diverse);

    - La terza tabella (testi) è praticamente identica alla seconda, solo che ovviamente ha il "testo esteso" dell'articolo.

    Quello che vorrei fare è una query che mi elenchi tutti gli articoli con i relativi titoli e testi nelle vartie lingue. Ho provato con una semplice:

    Codice PHP:
    SELECT FROM articoli
    LEFT JOIN titoli ON articoli
    .idArticolo titoli.idArticolo
    LEFT JOIN testi ON titoli
    .idArticolo testi.idArticolo 
    Solo che giustamente così mi elenca tutte le possibili combinazioni tra articolo, titolo e testo (ad esempio per un articolo in lingua italiana e inglese mi da una linea con titolo in italiano e testo in italiano, una con titolo in inglese e testo in inglese, una titolo in italiano e testo in inglese ed una con titolo in inglese e testo in italiano).

    Parlando in fanta-sql quello che mi servirebbe è qualcosa del tipo:

    Codice PHP:
    SELECT FROM articoli
    LEFT JOIN titoli ON articoli
    .idArticolo titoli.idArticolo
    LEFT JOIN testi ON titoli
    .idArticolo testi.idArticolo AND titoli.lingua testi.lingua 
    Dato che nella clausola ON non si possono indicare più condizioni per il legame tra tabelle come posso fare?

    L'unico modo che ho trovato, per ora, è:

    Codice PHP:
    SELECT FROM articoli
    LEFT JOIN titoli ON articoli
    .idArticolo titoli.idArticoli
    LEFT JOIN testi ON titoli
    .idArticolo testi.idArticolo
    HAVING titoli
    .lingua testi.lingua 
    Che, se non erro, crea la tabella con tutte le combinazioni e poi le filtra, un po' come se facesse la query senza HAVING e poi facesse una SELECT dei risultati filtrando ed eliminando tutte le combinazioni promiscue. Funziona... ma ho l'impressione che a livello di prestazioni non sia il massimo...

  2. #2
    al posto di having usa where ... anche se credo che lo faccia gia' mysql da se per ottimizzare la query.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2002
    Messaggi
    43
    Ciao, grazie per la risposta. Quindi non c'è niente che mi sfugge per migliorare in modo sensibile questa query?

  4. #4
    Originariamente inviato da flip79
    Ciao, grazie per la risposta. Quindi non c'è niente che mi sfugge per migliorare in modo sensibile questa query?
    se la tabella titoli e la tabella testi sono in relazione 1 a 1 e quindi il testo e' di fatto un attributo del titolo, tanto vale delle due tabelle farne una sola.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.