Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [sql]aiuto per impostazione query con JOIN

    salve a tutti! devo fare una query su 4 tabelle, ma non so come venirne fuori, vi posto il dump di queste 4 tabelle:

    codice:
    -- phpMyAdmin SQL Dump
    -- version 2.6.1
    -- http://www.phpmyadmin.net
    -- 
    -- Host: localhost
    -- Generato il: 29 Apr, 2005 at 09:50 AM
    -- Versione MySQL: 4.0.23
    -- Versione PHP: 4.3.10
    -- 
    -- Database: `teknolit`
    -- 
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `associazioni_accessori`
    -- 
    
    CREATE TABLE `associazioni_accessori` (
      `id_prodotto` bigint(20) NOT NULL default '0',
      `id_accessorio` bigint(20) NOT NULL default '0'
    ) TYPE=MyISAM;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `desc_accessori`
    -- 
    
    CREATE TABLE `desc_accessori` (
      `id_desc_accessori` bigint(20) NOT NULL auto_increment,
      `desc_accessori` text NOT NULL,
      `lingua` bigint(20) NOT NULL default '0',
      `accessorio` bigint(20) NOT NULL default '0',
      PRIMARY KEY  (`id_desc_accessori`),
      FULLTEXT KEY `desc_accessori` (`desc_accessori`)
    ) TYPE=MyISAM AUTO_INCREMENT=118 ;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `nome_accessori`
    -- 
    
    CREATE TABLE `nome_accessori` (
      `id_nome_accessorio` bigint(20) NOT NULL auto_increment,
      `accessorio` bigint(20) NOT NULL default '0',
      `nome` varchar(255) NOT NULL default '',
      `nome_gestionale` varchar(30) NOT NULL default '',
      `lingua` bigint(20) NOT NULL default '0',
      PRIMARY KEY  (`id_nome_accessorio`),
      FULLTEXT KEY `nome_gestionale` (`nome_gestionale`)
    ) TYPE=MyISAM AUTO_INCREMENT=377 ;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `prodotti`
    -- 
    
    CREATE TABLE `prodotti` (
      `id_prodotto` bigint(20) NOT NULL auto_increment,
      `serie` bigint(20) NOT NULL default '0',
      `designer` varchar(255) NOT NULL default '',
      PRIMARY KEY  (`id_prodotto`),
      FULLTEXT KEY `designer` (`designer`)
    ) TYPE=MyISAM AUTO_INCREMENT=271 ;
    ho riportato anche le versioni di phpMyAdmin e di mySQL nel caso possano servire.

    io devo ottenere con una query una cosa del genere:

    codice:
    id_prodotto | id_accessorio | nome_accessorio | desc_accessorio |
    la parte che non riesco a risolvere è quella relativa alla descrizione! in quanto non tutti gli accessori hanno una descrizione [la tabella delle descrizioni ha infatti 117 record, mentre quella dei nomi - tutti gli accessori hanno un nome - ne ha 376]

    io ho fatto una query del genere:

    codice:
    SELECT `prodotti`.`id_prodotto` , `associazioni_accessori`.`id_accessorio`, `nome_accessori`.`nome`, `desc_accessori`.`desc_accessori` 
    FROM `associazioni_accessori` 
    INNER JOIN `prodotti` ON `associazioni_accessori`.`id_prodotto` = `prodotti`.`id_prodotto` 
    INNER JOIN `nome_accessori` ON `nome_accessori`.`accessorio` = `associazioni_accessori`.`id_accessorio` 
    INNER JOIN `desc_accessori` ON `desc_accessori`.`accessorio` = `associazioni_accessori`.`id_accessorio`
    WHERE `nome_accessori`.`lingua` =1
    AND `desc_accessori`.`lingua` =1
    ORDER BY `id_prodotto`
    ma giustamente mi ritorna solo i record in cui è presente anche la colonna descrizione! invece io vorrei che se la descrizione non è presente mi restituisca il record vuoto! sto provando con tutti i tipi di JOIN ma non ne vengo a capo!

    mi date una mano? magari la soluzione sta dietro l'angolo, ma io non riesco a vederla!

    grazie mille!
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  2. #2
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Hai provato con il left join?
    Perchè hai fatto due tabelle (descr_accessori e nome_accessori) invece di una sola?

  3. #3
    il db non l'ho impostato io, è stato fatto così per "facilitare" le operazioni essendo un sito multilingua.

    "Non si pensava di dover fare queste operazioni" questa è stata la risposta

    ...se non si pensava 'mo son ca##i vostri! dovevo rispondere così!

    ho provato con tutti i join [LEFT, OUTER, RIGHT e combinati] l'unico risultato è che ci impiega 10sec ad eseguire la query ma non mi tira fuori niente.
    Con il RIGHT OUTER JOIN ho risolto parzialmente, nel senso che mi estrae un numero maggiore di record ma non ancora tutti.

    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  4. #4
    [supersaibal]Originariamente inviato da 13manuel84
    il db non l'ho impostato io, è stato fatto così per "facilitare" le operazioni essendo un sito multilingua.

    "Non si pensava di dover fare queste operazioni" questa è stata la risposta

    ...se non si pensava 'mo son ca##i vostri! dovevo rispondere così!

    ho provato con tutti i join [LEFT, OUTER, RIGHT e combinati] l'unico risultato è che ci impiega 10sec ad eseguire la query ma non mi tira fuori niente.
    Con il RIGHT OUTER JOIN ho risolto parzialmente, nel senso che mi estrae un numero maggiore di record ma non ancora tutti.

    [/supersaibal]
    right e left prendono i dati da un lato oppure dall'altro rendendo un NULL dove i dati sono mancanti

    Tutto sta a posizionare correttamente le tabelle, se usi left la tabella con possibili dati nulli deve stare a destra della definizione ON. Con right viceversa. E poi usa gli alias per le tabelle che ti semplifichi lo script.

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

  5. #5
    Utente di HTML.it L'avatar di Teuzzo
    Registrato dal
    Mar 2002
    Messaggi
    969
    Prova questa sequenza:

    ..
    FROM ((`nome_accessori` LEFT JOIN `desc_accessori` ON ...) INNER JOIN
    `associazioni_accessori` ON `associazioni_accessori`.`id_accessorio`=`nome_acc essori`.`accessorio`) INNER JOIN `prodotti` ON ..
    WHERE ...

  6. #6
    [supersaibal]Originariamente inviato da piero.mac
    right e left prendono i dati da un lato oppure dall'altro rendendo un NULL dove i dati sono mancanti

    Tutto sta a posizionare correttamente le tabelle, se usi left la tabella con possibili dati nulli deve stare a destra della definizione ON. Con right viceversa. E poi usa gli alias per le tabelle che ti semplifichi lo script. [/supersaibal]
    adesso smanetto un pò e vedo cosa riescoa a tirar fuori.
    gli alias li uso sempre, solo che qui non mi serve nessuno script, devo solo fare una query ed esportare i risultati in csv.

    [supersaibal]Originariamente inviato da Teuzzo
    Prova questa sequenza:

    ..
    FROM ((`nome_accessori` LEFT JOIN `desc_accessori` ON ...) INNER JOIN
    `associazioni_accessori` ON `associazioni_accessori`.`id_accessorio`=`nome_acc essori`.`accessorio`) INNER JOIN `prodotti` ON ..
    WHERE ... [/supersaibal]
    penso ci sia un problema di lingue!!
    'sto database è più incasinato di quanto pensassi.
    se non metto nessuna clausola where mi prende ogni combinazione possibile, se invece metto come clausola la lingua pari a 1 mi taglia anche dei dati che [in teoria ] non dovrebbe


    grazie ad entrambi per l'aiuto! purtroppo per ora non ho trovato la soluzione, c'ho il cervello in fumo!

    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  7. #7
    dunque, il problema l'ho centrato, solo che non so come risolverlo

    la query che mi ha proposto Teuzzo è perfetta:
    codice:
    SELECT `prodotti`.`id_prodotto` , `associazioni_accessori`.`id_accessorio`, `nome_accessori`.`nome`, `desc_accessori`.`desc_accessori` 
    FROM ((`nome_accessori` LEFT JOIN `desc_accessori` ON `nome_accessori`.`accessorio` = `desc_accessori`.`accessorio`) INNER JOIN 
    `associazioni_accessori` ON `associazioni_accessori`.`id_accessorio`=`nome_accessori`.`accessorio`) INNER JOIN `prodotti` 
    ON `prodotti`.`id_prodotto` = `associazioni_accessori`.`id_prodotto` 
    WHERE  `nome_accessori`.`lingua` = 1 
    AND `desc_accessori`.`lingua` = 1
    ORDER BY `associazioni_accessori`.`id_prodotto`
    il problema è appunto quello che ho messo in grassetto! io specifico che la lingua deve essere italiana, cioè pari a 1, ma appunto quando nella tabella descrzione, la descrizione non è presente mi scarta il record a priori, ho provato ad aggiungere a calusola AND (`desc_accessori`.`lingua` = 1 OR `desc_accessori`.`lingua` = NULL) al posto del semplice AND `desc_accessori`.`lingua` = 1
    ma non cambia niente!

    come posso risolvere? grazie!
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  8. #8
    sono un cretino

    dovevo usare IS NULL al posto di = NULL

    Grazie ad entrambi per i suggerimenti!
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

  9. #9
    [supersaibal]Originariamente inviato da 13manuel84
    sono un cretino

    dovevo usare IS NULL al posto di = NULL

    Grazie ad entrambi per i suggerimenti! [/supersaibal]
    ho ricevuto solo ora la notifica del tuo post...

    Guarda che le parentesi in from e join servono a nulla. Sono tutti valori in AND tra di loro tra parentesi o meno. Pero' se ci sono parentesi queste devono essere risolte. provaci senza...


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

  10. #10
    ho tolto le parentesi tra i vari JOIN ma ho lasciato quelle della colausola WHERE perché mi serve che prima verifichi quella condizione.

    Grazie ancora!
    Talvolta anche una persona apparentemente inutile si rivela un abile samurai dalla forza di mille uomini, dimostrando di poter rinunciare alla vita e che il suo cuore si è completamente identificato con quello del suo padrone

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 © 2024 vBulletin Solutions, Inc. All rights reserved.