2014-05-16 126 views
0

好的,这是我正在尝试做的。我有一个标签(pid,tag)产品(id, name)。有很多与一种产品相关的标签。试图按照产品类别将标签与产品关联

我有一个标签过滤器选项,我可以选择一个标签,它会按标签过滤产品。可以查询1个标签或查询10个标签。例如,有所有标签的复选框,用户可以根据需要选择任意数量的标签,并且应该过滤具有这些标签关联的产品。

似乎无法找出这样做的最快方法。

我可以得到每个产品的标签相当快,但我怎么会得到与标签标签每一件产品。这是我期待的。

标签被搜索: '甲板安装,单,3英寸'

产品

ID,名称,数组(甲板安装,单,3英寸,海峡,黑,绿,蓝)

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

这是我使用的查询的一个例子。这是两张桌子。

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; 

在与一个产品相关的标签列中有许多标签。我正在使用ajax搜索一组标签以获取产品ID以获取产品。问题是有这么多,所以它需要永远。我想我已经在想这件事了。

每当我检查一个复选框时,我运行查询并发送一个逗号分隔的所有选定复选框的字符串。

+0

请发布一些代码 – Ejaz

+0

您将需要构建或使用一个数据库类,它允许您根据需要构建查询。即$ query-> addWhere(“tag.name ='Deck Mount'”) - > addWhere(“tag.name ='3in'”);否则,这只是正确执行连接的问题。如果你回来了,你已经尝试过,我会进一步帮助。 – skrilled

+0

jquery,ajax和codeigniter与这个问题有关吗?到目前为止你做了什么?这是不是很清楚你想要做什么(你可以在你的查询中使用'AND',或许?),发布你正在使用的代码 –

回答

0

终于搞明白了。这是我现在的查询。

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%'; 
相关问题