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

    [MySQL] Query un po' complessa di multiselezione

    Salve ragazzi. Ho da fare una query un po' complessa che adesso non risce proprio a fare (ma credo nemmeno quando sarò meno stanco! ). Ora vi spiego.

    Ho tre tabelle:

    catalog_purchases_countries
    - id
    - country

    catalog_shipments_types
    - id
    - name
    - country (relazione con catalog_purchases_countries)

    catalog_payments_types
    - id
    - name
    - country (relazione con catalog_purchases_countries)

    Ora io voglio ottenere una lista dei paesi per i quali esista un metodo di pagamento (catalog_payments_types) ed esista un metodo di spedizione (catalog_shipments_types).

    La mia versione di MySQL supporta le sottoselezioni. Mi suggerite la query da usare? Grazie mille! Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  2. #2
    Moderatore di Server Apache L'avatar di marketto
    Registrato dal
    Sep 2001
    Messaggi
    5,858
    mmmmmm...una cosa di questo tipo dovrebbe andare:
    codice:
    SELECT cpc.id, cpc.country
    FROM catalog_purchases_countries AS cpc
    INNER JOIN catalog_shipments_types AS cst ON cst.country = cpc.country
    INNER JOIN catalog_payments_types AS cpt ON cpt.country = cpc.country


    think simple think ringo

  3. #3
    Perfetto! Grazie mille! Non ci sarei mai arrivato!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  4. #4
    No, mi sono sbagliato! Non dà errore però non seleziona niente! Ora posto il dump delle tre tabelle così magari potete fare delle prove in locale:

    codice:
    CREATE TABLE `catalog_shipments_types` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(255) NOT NULL default '',
      `price` decimal(10,2) NOT NULL default '0.00',
      `country` int(10) NOT NULL default '0',
      `min_time_del` int(11) NOT NULL default '0',
      `max_time_del` int(11) NOT NULL default '0',
      `cod` decimal(10,2) NOT NULL default '0.00',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    
    -- 
    -- Dump dei dati per la tabella `catalog_shipments_types`
    -- 
    
    INSERT INTO `catalog_shipments_types` (`id`, `name`, `price`, `country`, 
    `min_time_del`, `max_time_del`, `cod`) 
    VALUES (1, 'Poste Italiane', 8.60, 94, 24, 48, 0.00),
    (2, 'Corriere espresso', 5.00, 94, 24, 48, 0.00);
    
    CREATE TABLE `catalog_purchases_countries` (
      `id` int(11) NOT NULL auto_increment,
      `country` varchar(255) NOT NULL default '',
      `able` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=213 ;
    INSERT INTO `catalog_purchases_countries` (`id`, `country`, `able`) 
    VALUES (94, 'Italia', 0) ;
    
    CREATE TABLE `catalog_payments_types` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(255) NOT NULL default '',
      `country` int(10) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
    
    -- 
    -- Dump dei dati per la tabella `catalog_payments_types`
    -- 
    
    INSERT INTO `catalog_payments_types` (`id`, `name`, `country`) 
    VALUES (1, 'Bonifico bancario', 94);
    Nella tabella catalog_purchases_countries in realtà ci sono molti più record ma ne ho postato solo uno (quello usato dalle altre due tabelle) per non appesantire inutilmente il forum.
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  5. #5
    Io ho provato in questo modo ma dà errore

    codice:
    SELECT catalog_purchases_country.id AS id ,
    		                 catalog_purchases_country.country AS country,
    FROM catalog_purchases_countries
    WHERE ( SELECT COUNT(catalog_payments_types.id) 
              FROM catalog_payments_types WHERE country = id ) > 0
    AND ( SELECT COUNT(catalog_shipments_types.id)
            FROM catalog_shipments_types WHERE country = id ) > 0
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM catalog_purchases_countries WHERE ( SELECT COUNT(catalog_payments_t' at line 3
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  6. #6
    Ho risolto! Sono uno stupido! Avevo messo una virgola in più mentre io pensavo che l'errore fosse la subselection! Grazie comunque! Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  7. #7
    SELECT cpc.id, cpc.country
    FROM catalog_purchases_countries AS cpc
    INNER JOIN catalog_shipments_types AS cst ON cst.country = cpc.id
    INNER JOIN catalog_payments_types AS cpt ON cpt.country = cpc.id

  8. #8
    Originariamente inviato da mircov
    Ho risolto! Sono uno stupido! Avevo messo una virgola in più mentre io pensavo che l'errore fosse la subselection! Grazie comunque! Ciao!
    fai dei test, la join potrebbe essere + veloce, anche se non ne sono sicuro (io viaggio con le sub disabilitate)

  9. #9
    Nada! E sono pure doppiamente scemo! Per fare le modifiche ho "perso" la query. Ma tanto l'ho fatta una volta la faccio pure la seconda! Grazie mille! Ciao!

    EDIT
    La query di Bubu77 funziona parzialmente nel senso che restituisce due volte "Italia".
    Credo che con un distinct, però, si risolva il problema. Ora provo e ti faccio sapere, bubu77. Grazie!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

  10. #10
    Si, con il distinct funziona perfettamente! Grazie mille! Ciao!
    eCommerceRS.NET - Commerciante, vendi on-line!
    Il mio nick è mircov e non mirco!!!

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.