2013-04-09 126 views
0

如何選擇具有由用戶指定的所有屬性的產品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

回答

0

這是你需要什麼?

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

0

如果你想獲取僅具有所有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