MYSQL过滤器产品通过属性

问题描述:

如何选择具有由用户指定的所有属性的产品MYSQL过滤器产品通过属性

例如:指定用户属性来搜索产品:41,2,4,6

MYSQL结构是:

表:报价

`id` int(11) NOT NULL auto_increment, 

`title_pl` varchar(100) character set utf8 collate utf8_polish_ci NOT NULL, 

表:offer_att

`id` int(11) NOT NULL auto_increment, 
`offer_id` int(11) NOT NULL, 
`att_id` int(11) NOT NULL, 

表ATT

`id` int(11) NOT NULL auto_increment, 

`title_pl` varchar(255) character set utf8 collate utf8_polish_ci NOT NULL, 
+1

ç你给出样本数据和输出? – 2013-04-09 11:07:49

+0

定义这'具有用户指定的所有属性' – 2013-04-09 11:08:52

+1

你为什么要标记它的PHP? – ITroubs 2013-04-09 11:09:45

这是你需要什么?

SELECT * 
FROM offer 
WHERE id IN 
    (SELECT offer_id 
    FROM offer_att oa, 
      att a 
    WHERE a.title_pl IN (41, 
          2, 
          4, 
          6) 
     AND a.id = oa.att_id); 

P.S. Here是一个示例小提琴。

+0

好。但如果产品没有属性6(有onli 41,2,4)将被列出,并且不应该是 – jasne 2013-04-09 11:28:30

+0

@jasne,您可以将参数放入POST或GET – Alepac 2013-04-09 12:25:47

如果你想获取仅具有所有4个属性(41,2,4,6)报价在一起,然后如果你想获取该至少有一个报价,你应该使用一个查询

SELECT 
    o.id 
    o.title_pl 
FROM 
    offer o INNER JOIN offer_att oa ON o.id = oa.offer_id AND oa.att_id IN (41,2,4,6) 
GROUP BY o.id 
HAVING COUNT(DISTINCT oa.att_id) = 4 

的属性(41或2或4或6)用这一个:

SELECT 
    o.id 
    o.title_pl 
FROM 
    offer o INNER JOIN offer_att oa ON o.id = oa.offer_id AND oa.att_id IN (41,2,4,6) 

PHP代码来生成对您的SQL查询参数:

<?php 
$attributes = array(41, 2, 4, 6); 
$count = count($attributes); 
$list = implode(',', $attributes); 
$query = ' 
    SELECT 
     o.id 
     o.title_pl 
    FROM 
     offer o INNER JOIN offer_att oa ON o.id = oa.offer_id AND oa.att_id IN (' . $list . ') 
'; 
$db->query($query); 
?> 
+0

好。但如果产品没有属性6(有onli 41,2,4)将被列出并且不应该是 – jasne 2013-04-09 11:27:56

+0

如果您使用php,您可以使用'count($ attributes)'来获得**'4'**和' implode(',',$ attributes)'获得**'41,2,4,6'**字符串。 然后,您必须将这些字符串放在查询中的正确位置。 – 2013-04-09 11:29:38

+0

我还没有理解你的评论 – 2013-04-09 11:31:01