2015-11-20 86 views
0

目前一個項目,我需要從同一列多行不同的條件Mysql的過濾器

CREATE TABLE IF NOT EXISTS `spec_property` (
`sp_id` int(11) unsigned NOT NULL, 
    `spm_id` int(11) unsigned NOT NULL, 
    `spec_value` varchar(255) NOT NULL, 
    `spec_last_value` varchar(55) DEFAULT NULL, 
    `product_id` int(11) unsigned NOT NULL, 
    `spec_order_by` tinyint(2) unsigned DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=77 ; 
ALTER TABLE `spec_property` 
ADD PRIMARY KEY (`sp_id`), ADD KEY `product_id` (`product_id`), ADD KEY `spec_value` (`spec_value`); 
ALTER TABLE `spec_property` 
MODIFY `sp_id` int(11) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=75; 
INSERT INTO `spec_property` (`sp_id`, `spm_id`, `spec_value`, `spec_last_value`, `product_id`, `spec_order_by`) VALUES 

(31, 23, 'Octa Core', NULL, 4, NULL), 
(34, 26, '2048', 'MB', 4, NULL), 
(35, 27, '8192', 'MB', 4, NULL), 
(36, 28, '2048', 'MB', 4, NULL), 
(69, 62, 'Android', NULL, 4, NULL), 
(70, 63, '5', NULL, 4, NULL), 
(71, 65, 'Yes', NULL, 4, NULL), 
(72, 66, 'Yes', NULL, 4, NULL), 
(73, 67, '32000', NULL, 4, NULL), 
(74, 68, '25', 'fps', 4, NULL);CREATE TABLE IF NOT EXISTS `spec_property` (
`sp_id` int(11) unsigned NOT NULL, 
    `spm_id` int(11) unsigned NOT NULL, 
    `spec_value` varchar(255) NOT NULL, 
    `spec_last_value` varchar(55) DEFAULT NULL, 
    `product_id` int(11) unsigned NOT NULL, 
    `spec_order_by` tinyint(2) unsigned DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=77 ; 
ALTER TABLE `spec_property` 
ADD PRIMARY KEY (`sp_id`), ADD KEY `product_id` (`product_id`), ADD KEY `spec_value` (`spec_value`); 
ALTER TABLE `spec_property` 
MODIFY `sp_id` int(11) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=75; 
INSERT INTO `spec_property` (`sp_id`, `spm_id`, `spec_value`, `spec_last_value`, `product_id`, `spec_order_by`) VALUES 

(31, 23, 'Octa Core', NULL, 4, NULL), 
(34, 26, '2048', 'MB', 4, NULL), 
(35, 27, '8192', 'MB', 4, NULL), 
(36, 28, '2048', 'MB', 4, NULL), 
(69, 62, 'Android', NULL, 4, NULL), 
(70, 63, '5', NULL, 4, NULL), 
(71, 65, 'Yes', NULL, 4, NULL), 
(72, 66, 'Yes', NULL, 4, NULL), 
(73, 67, '32000', NULL, 4, NULL), 
(74, 68, '25', 'fps', 4, NULL); 

http://sqlfiddle.com/#!9/95329/3

SELECT distinct(product_id) 
FROM `spec_property` 
WHERE (spm_id = '62' AND spec_value IN ('Android' , 'Windows')) 
    AND (spm_id = '27' AND spec_value BETWEEN 4096 AND 131072) 

過濾唯一的產品ID的工作。如果我使用'OR'條件我可以得到這個結果:

http://sqlfiddle.com/#!9/95329/1)。其實我需要從spec_property找到產品ID的這是比賽就像

過濾選項中選擇不同的(產品),其中spm_id_62 IN ( '安卓', '窗口')和spm_id_27 BETWEEN 4096 AND 131072

+0

我想如果你在上面的查詢中使用'OR',你只會得到不同的product_id 4。 – Sathish

+0

嘿,Jacky,正如你在使用OR語句時所提到的,你可以同時獲得Android/Windows,62值和27值。您的原始查詢沒有意義,因爲它要求有衝突的值(即spm_id = 62&spm_id = 27)。目前還不清楚你真的需要什麼,你能否詳細說明一下? 你會得到只是4的id,因爲你問了不同的id(他們都是4的) –

+0

請參閱http://stackoverflow.com/questions/33813037/manipulate-rows-using-multiple-clauses-in-mysql – JRD

回答

0

使用或

SELECT distinct(product_id) 
FROM `spec_property` 
WHERE (spm_id = '62' AND spec_value IN ('Android' , 'Windows')) 
    OR (spm_id = '27' AND spec_value BETWEEN 4096 AND 131072) 
+0

已經在我的問題中提到我使用'OR'但它需要使用'AND ' – jacky

+0

jacky這兩個id在條件是** spm_id **或是** sp_id ** @jacky –

0

如果你正在尋找一種方式來查找符合所有過濾條件的產品,你可以使用self join solution

找到與所有過濾器匹配的所有產品的另一種方法,假定每個產品ID的spm_id都是唯一的。

SELECT product_id 
FROM `spec_property` 
where (spm_id = '62' and spec_value in ('Android' , 'Windows')) 
or (spm_id = '27' and spec_value between 4096 and 131072) 
group by product_id having count(*) = 2; -- number of filters 
+0

我將使用許多條件** SPM_ID *** --------- Select distinct(product_id )from spec_property其中spm_id_62 IN('Android','Windows')和spm_id_27 BETWEEN 4096 AND 131072 and spm_id_26 BETWEEN 4096 AND 131072 and spm_id_23 in('octa core','dual core') – jacky

+0

然後,只要保持每一個添加爲加入或調整計數相等。 – JRD

0

您是否期待這一個?

select distinct(a.product_id) from `spec_property` a 
inner join `spec_property` b on 
a.product_id=b.product_id and a.spm_id = '62' and a.spec_value in 
('Android' , 'Windows') and b.spm_id = '27' and 
b.spec_value between 4096 and 131072 
+0

我將在SPM_ID中使用許多條件* ---------從spec_property中選擇不同的(product_id),其中spm_id_62 IN('Android','Windows')和spm_id_27 BETWEEN 4096 AND 131072和spm_id_26 BETWEEN 4096 AND 131072和('八核','雙核')中的spm_id_23 – jacky