好的,这就是我想要做的。我有一个标记列(pid,tag)
和一个产品列(id, name)
。有很多与一种产品相关的标签。
我有标签过滤器选项,我可以在其中选择标签,它会按标签过滤产品。可以查询1个标签或查询10个标签。例如,有包含所有标签的复选框,用户可以根据需要选择任意数量的标签,并且应该过滤那些与这些标签关联的产品。
似乎无法找出最快的方法。
我可以非常快速地获得每个产品标签,但我如何通过标签获得带有标签的每个产品。这就是我所期待的。
被搜索的标签:'Deck Mount,Single,3in'
产品
id,name,array(Deck Mount,Single,3in,Strait,Black,Green,Blue)
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 :(得分: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%';