tabelle caratteristiche e prodotti

  • Creatore Discussione Creatore Discussione teo12
  • Data di inizio Data di inizio

teo12

Nuovo Utente
15 Dic 2011
7
0
0
Ciao,
vi spiego subito il mio problema ,
ho una tabella prodotti dove sono elencati tutti i vari prodotti con le informazioni sul prezzo, nome , ecc.
nella tabella sono presenti prodotti di diverso tipo ad esempio cpu , hard disk , banchi ram ... e presentano caratteristiche diverse.
Quando navigo nelle varie sezioni del sito ci sono delle opzioni che servono per filtrare le ricerche ...ad esempio, se voglio visualizzare solo le cpu che hanno 2 core o per gli hard disk quelli esterni o interni...
ed ecco il problema ...come posso impostare la tabella che tiene conto delle caratteristiche dei prodotti??

Se fossero tutte cpu potrei impostare un tot di campi in più con le informazioni che mi servono per filtrare i prodotti , come in questo modo

nome cpu - marca - numero core...

ma essendo diverse tipologie di prodotto con diverse caratteristiche non è possibile fare questo , quindi pensavo di fare delle tabelle divise per categoria con le caratteristiche di ogni prodotto, volevo però sapere se questa è un' opzione valida e se esistono soluzioni migliori.
 
Allora io farei così. Crei due tabelle, una che contiene i campi che si possono inserire in tutte le categorie (campi_categorie) e una che contiene i campi di ogni singolo prodotto (campi_prodotti), con una struttura simile a questa:
Codice:
CREATE TABLE `campi_categorie` (
  `id_campo` int(11) NOT NULL AUTO_INCREMENT,
  `id_categoria` int(11) NOT NULL,
  `nome_campo` varchar(255) NOT NULL,
  PRIMARY KEY (`id_campo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `campi_prodotti` (
  `id_campo` int(11) NOT NULL AUTO_INCREMENT,
  `id_prodotto` int(11) NOT NULL,
  `valore_campo` text NOT NULL,
  PRIMARY KEY (`id_campo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Nell'area di amministrazione di una categoria avrai la possibilità di associarle uno o più campi (che saranno inseriti nella tabella campi_categorie) e, quando inserirai un nuovo prodotto, dovrai compilarli (e li inserirai nella tabella campi_prodotti). Ricordati di cancellare tutti i campi associati ad una categoria quando la cancelli.
 
ciao
ma essendo un prodotto appartenente ad una categoria a meno che non sbagli non dovresti fare così?

CREATE TABLE `campi_prodotti` (
`id_campo` int(11) NOT NULL AUTO_INCREMENT,
`id_categoria` int(11) NOT NULL,
`valore_campo` text NOT NULL,
PRIMARY KEY (`id_campo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
grazie , per le risposte ...
comunque avevo già provato a fare in questo modo ma avevo riscontrato un problema...
le categorie possono avere più opzioni di filtraggio , faccio un esempio
nella categoria cpu posso filtrare le cpu per il numero di core ...ma anche per marca...quindi usando la struttura che mi avete suggerito per ogni cpu devo inserire 2 record nella tabella campi_prodotti, uno che mi identifica il numero di core e uno la cpu .... quando vado a filtrare per un solo campo non ci sono problemi perchè ottengo i prodotti che hanno quella marca o quel numero di core , ma se specifico sia la marca che il numero di core non posso fare il filtraggio utilizzando la clausola 'AND' perchè i valori sono in record diversi e quindi non mi trova nessun dato.
 
@borgo: no, perché la tabella che contiene i prodotti è un'altra. Il campo si riferisce al prodotto, e il prodotto alla categoria.

@teo12: puoi risolvere la cosa con una query di questo tipo:
Codice:
SELECT * FROM prodotti p WHERE (SELECT valore_campo FROM campi_prodotti WHERE id_campo = campo_core AND id_prodotto = p.id) = valore_core AND (SELECT valore_campo FROM campi_prodotti WHERE id_campo = campo_marca AND id_prodotto = p.id) = valore_marca
Devi modificare gli ID dei campi e i relativi valori.

È un po' macchinoso, ma, a parte filtrare manualmente i record usando PHP (che porterebbe ad un grande calo delle performance), non ci sono altre soluzioni eleganti.
 
Ultima modifica:
@borgo: no, perché la tabella che contiene i prodotti è un'altra. Il campo si riferisce al prodotto, e il prodotto alla categoria.

@teo12: puoi risolvere la cosa con una query di questo tipo:
Codice:
SELECT * FROM prodotti WHERE (SELECT valore_campo FROM campi_prodotti WHERE id_campo = 1) = valore1 AND (SELECT valore_campo FROM campi_prodotti WHERE id_campo = 2) = valore2
Devi modificare gli ID dei campi e i relativi valori.

non ho capito il procedimento di questa query...
 
Per forza, l'avevo sbagliata! :D
Ho aggiunto una condizione al WHERE.

In pratica seleziona tutte le CPU il cui campo "numero di core" sia uguale a quello dato, così come il campo "marca". Ovviamente devi sempre sostituire gli ID con quelli dei campi e i valori con quelli specificati dall'utente.
 
Per forza, l'avevo sbagliata! :D
Ho aggiunto una condizione al WHERE.

In pratica seleziona tutte le CPU il cui campo "numero di core" sia uguale a quello dato, così come il campo "marca". Ovviamente devi sempre sostituire gli ID con quelli dei campi e i valori con quelli specificati dall'utente.

non ho ancora capito...puoi essere più chiaro
 
In pseudocodice significa:
Codice:
Seleziona tutti i record dalla tabella prodotti dove:

    il valore della seguente espressione:
        Seleziona il valore del campo 'valore_campo' del record dalla tabella campi_prodotti dove il campo 'id_campo' è uguale al valore 'campo_core' e il campo 'id_prodotto' è uguale al campo 'id' selezionato dalla tabella prodotti
    è uguale al valore 'valore_core'

    e il valore della seguente espressione:
        Seleziona il valore del campo 'valore_campo' del record dalla tabella campi_prodotti dove il campo 'id_campo' è uguale al valore 'campo_marca' e il campo 'id_prodotto' è uguale al campo 'id' selezionato dalla tabella prodotti
    è uguale al valore 'valore_marca'
Fa quello che hai chiesto... Prova ad adattarla.
 
In pseudocodice significa:
Codice:
Seleziona tutti i record dalla tabella prodotti dove:

    il valore della seguente espressione:
        Seleziona il valore del campo 'valore_campo' del record dalla tabella campi_prodotti dove il campo 'id_campo' è uguale al valore 'campo_core' e il campo 'id_prodotto' è uguale al campo 'id' selezionato dalla tabella prodotti
    è uguale al valore 'valore_core'

    e il valore della seguente espressione:
        Seleziona il valore del campo 'valore_campo' del record dalla tabella campi_prodotti dove il campo 'id_campo' è uguale al valore 'campo_marca' e il campo 'id_prodotto' è uguale al campo 'id' selezionato dalla tabella prodotti
    è uguale al valore 'valore_marca'
Fa quello che hai chiesto... Prova ad adattarla.


ho provato cosi ma non funziona ... forse sbaglio io qualcosa

Codice:
SELECT *
FROM prodotti
WHERE (

SELECT valore_campo
FROM prodotti AS p,  campi_prodotti AS cp
WHERE cp.id_campo =1 // campo num core
AND p.id_prodotto = cp.id_prodotto

) = 'valore1'
AND (

SELECT valore_campo
FROM prodotti AS p,  campi_prodotti AS cp
WHERE cp.id_campo =2 // campo marca
AND p.id_prodotto = cp.id_prodotto

) = 'valore2'
 
non mi torna ....comunque le subquery non accettano risultati con più record quindi questa query non può funzionare.
 

Discussioni simili