2014-05-16 2 views
0

Ok, voici ce que j'essaie de faire. J'ai un étiquettes colonne (pid,tag) et un produits colonne (id, name). Il y a une tonne de tags liés à un produit.Essayer de relier les étiquettes aux produits par catégorie de produits

J'ai un tags filtre option où je peux sélectionner une étiquette et il va filtrer les produits par des étiquettes. Une étiquette peut être interrogée ou 10 étiquettes peuvent être interrogées. Par exemple, il existe des cases à cocher avec toutes les balises et l'utilisateur peut sélectionner autant de balises qu'il le souhaite et il doit filtrer les produits associés à ces balises.

Impossible de trouver le moyen le plus rapide de le faire.

Je peux obtenir chaque étiquette de produit assez rapidement, mais comment pourrais-je obtenir chaque produit avec les étiquettes par étiquettes. Voici ce que j'attends.

Balises fouillées par: 'Pont du Mont, simple, 3in'

produits

id, nom, tableau (pont Mont, unique, 3po, détroit, Noir, Vert, Bleu)

select p.* 
from products p 
HAVING p.loc_cat = 'Faucets' 
AND (select pid 
    from tags 
    where pid = p.id 
    AND tag = 'BODY:DECK MOUNT'); 

C'est un exemple de la requête que j'utilise. Voici les deux tables.

CREATE TABLE `tags` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `tag` varchar(255) NOT NULL DEFAULT '', 
    `pid` varchar(255) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=23128 DEFAULT CHARSET=latin1; 

CREATE TABLE `products` (
    `prod_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `list` varchar(255) DEFAULT NULL, 
    `desc` text, 
    `harmonize` varchar(255) DEFAULT NULL, 
    `id` varchar(255) DEFAULT '', 
    `loc_cat` varchar(255) DEFAULT '', 
    `loc_desc` varchar(255) DEFAULT '', 
    `pcode` int(100) DEFAULT NULL, 
    `pcodedesc` varchar(255) DEFAULT '', 
    `pid` varchar(255) DEFAULT NULL, 
    `search_string` text, 
    `upc` varchar(255) DEFAULT NULL, 
    `date__updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`prod_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3908 DEFAULT CHARSET=latin1; 

Avec de nombreuses étiquettes dans la colonne des étiquettes associées à un produit. J'utilise ajax pour rechercher un ensemble de tags pour saisir les identifiants de produits pour obtenir les produits. Le problème est qu'il y a tellement de choses, donc ça prend une éternité. Je pense que je suis trop penser.

Chaque fois que je coche une case, j'exécute la requête et envoie une chaîne séparée par des virgules de toutes les cases cochées.

+0

s'il vous plaît poster un code – Ejaz

+0

Vous devrez construire ou utiliser une classe de base de données qui vous permet de construire la requête basée sur ce qui est nécessaire. C'est à dire. $ query-> addWhere ("tag.name = 'Deck Mount'") -> addWhere ("tag.name = '3in'"); Sinon, c'est juste une question d'exécution correcte des jointures. Si vous revenez avec ce que vous avez essayé jusqu'ici, je vous aiderai plus loin. – skrilled

+0

Est-ce que jquery, ajax et codeigniter sont pertinents pour cette question? Qu'avez-vous fait jusqu'à présent? Ce n'est pas vraiment clair ce que vous essayez de faire (vous pouvez utiliser un 'AND' dans votre requête, peut-être?), Afficher le code que vous utilisez –

Répondre

0

Enfin compris les gars. Voici ma requête maintenant.

select p.*, 
    (select GROUP_CONCAT(tag) from tags where pid = p.id) as tags 
    from products p 
    HAVING p.loc_cat = 'Pre-rinse Units' 
    AND tags LIKE '%BODY:DECK MOUNT%' AND tags LIKE '%BODY:SINGLE%'; 
Questions connexes