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

    aiuto query join su 3 tabelle

    ho 3 tabelle, la cui struttura è:
    codice:
    -- 
    -- Struttura della tabella `CATEGORIE`
    -- 
    
    CREATE TABLE `CATEGORIE` (
      `CATEGORIA_ID` int(10) unsigned NOT NULL auto_increment,
      `CATEGORIA` varchar(255) default NULL,
      `META` text,
      `NUOVO` char(1) NOT NULL default 'N',
      PRIMARY KEY  (`CATEGORIA_ID`)
    ) TYPE=MyISAM AUTO_INCREMENT=9 ;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `PRODOTTI`
    -- 
    
    CREATE TABLE `PRODOTTI` (
      `PRODOTTO_ID` int(10) unsigned NOT NULL auto_increment,
      `PREZZO` double unsigned NOT NULL default '0',
      `MARCA_ID` int(10) unsigned NOT NULL default '0',
      `CATEGORIA_ID` int(10) unsigned NOT NULL default '0',
      `FAMIGLIA_ID` int(10) unsigned NOT NULL default '0',
      `MODELLO` varchar(100) default NULL,
      `TESTO_HTML` text,
      `PRODUZIONE_ANNO` varchar(20) default NULL,
      `CODICE` varchar(50) NOT NULL default '',
      PRIMARY KEY  (`PRODOTTO_ID`)
    ) TYPE=MyISAM AUTO_INCREMENT=37 ;
    
    -- --------------------------------------------------------
    
    -- 
    -- Struttura della tabella `PRODOTTI_IMG`
    -- 
    
    CREATE TABLE `PRODOTTI_IMG` (
      `PRODOTTO_IMG_ID` int(10) unsigned NOT NULL auto_increment,
      `PRODOTTO_ID` int(10) unsigned NOT NULL default '0',
      `IMG_DEFAULT` char(1) NOT NULL default 'N',
      PRIMARY KEY  (`PRODOTTO_IMG_ID`)
    ) TYPE=MyISAM AUTO_INCREMENT=11 ;
    quello che dovrei ottenere è la lista dei prodotti e l'imamgine in cui IMG_DEFAULT vale 'Y'
    dove l'immagine di default non esiste deve comunque tirarmi fuori il record ma con un valore ovviamente nullo. Io ho fatto questa query:
    codice:
    SELECT M.MARCA, P.CATEGORIA_ID, P.PRODOTTO_ID, P.MODELLO, P.PREZZO, 
    PI.PRODOTTO_IMG_ID FROM PRODOTTI P LEFT OUTER JOIN MARCHE M ON 
    P.MARCA_ID=M.MARCA_ID RIGHT OUTER JOIN PRODOTTI_IMG PI ON 
    P.PRODOTTO_ID=PI.PRODOTTO_ID WHERE CATEGORIA_ID=6 AND IMG_DEFAULT='Y'
    ORDER BY M.MARCA, P.MODELLO, P.PREZZO
    ma il risultato che ne ottengo è che mi estrae i prodotti giusti, ma nella colonna PRODOTTO_IMG_ID mi ritrovo sempre un valore reale anche quando questo non esiste...
    sto provando i vari tipi di JOIN, ma non ne vengo a capo. Sapete dirmi dove sbalgio nel ragionamento?



    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
    prima ho sbagliato tabelle scucate, al posto della tabella categorie ce n'è una marche con una struttura comunque identica a quella che ho postato, quindi: MARCA_ID e MARCA
    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

  3. #3
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Tanto per cominciare sbagli nel fare una RIGHT JOIN sulle immagini, che non ha senso. Fai una LEFT JOIN.
    In secondo luogo devi togliere IMG_DEFAULT='y' dalla condizione di WHERE, perché altrimenti ti vengono eliminati tutti i prodotti che hanno un valore diverso, mentre tu hai detto che li vuoi con l'immagine a NULL.
    Quindi nella SELECT dovrai sostituire PI.PRODOTTO_IMG_ID con una cosa di questo tipo
    codice:
    if (img_default='Y', PI.PRODOTTO_IMG_ID, null)

  4. #4
    innanzitutto grazie per la risposta! ora provo a fare come dici...

    poi vorrei chiederti una cosa: non hai un link di riferimento che spieghi BENE la differenza tra i vari JOIN? perché finora io trovo solo esempi ma spiegazioni zero...so che dagi esempi dovrei/potrei capire, ma non ci riesco.




    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

  5. #5
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non esiste una vera e propria differenza fra LEFT JOIN e RIGHT JOIN: logicamente è la stessa cosa, solo con le tabelle elencate in ordine inverso. Comunque prova a dare un'occhiata qui

    http://database.html.it/guide/lezion...so-delle-join/

  6. #6
    è proprio quella logica che una volta letta non mi resta in testa



    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

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.