2012-12-13 35 views
1

我有結構的SQL表從一個單一的表中選擇值上MySQL的選擇查詢以根據條件

CREATE TABLE IF NOT EXISTS `engine4_user_fields_values` (
    `item_id` int(11) unsigned NOT NULL, 
    `field_id` int(11) unsigned NOT NULL, 
    `value` text COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`item_id`,`field_id`,`index`) 
) 

我想選擇與FIELD_ID = '17' AND值IN的行(5,8 ,7)+ field_id = '20'AND values IN(73,76)

我無法像下面給出的那樣選擇它,因爲如果field_id是17,它不會是20!

SELECT * FROM `engine4_user_fields_values` WHERE (field_id ='17' AND value IN(5,8,7)) AND (field_id ='20' AND value IN(73,76)) 

如果我們使用或然後它會選擇滿足任何條件的值。

我們可以用join嗎?我不確定代碼! 任何人都可以幫助我得到這個選擇查詢

回答

1

你可以group by項目,並使用having條款,要求該項目已匹配兩個條件的行:

select item_id 
from engine4_user_fields_values 
group by 
     item_id 
having max(case when field_id ='17' and value in (5,8,7) then 1 end) = 1 
     and max(case when field_id ='20' and value in (73,76) then 1 end) = 1 
1

從您的描述,它聽起來像你應該改變中間的AND到OR。您想要返回匹配第一個條件或第二個條件的所有行。現場標識不能是17和20

SELECT * FROM `engine4_user_fields_values` WHERE (field_id ='17' AND value IN(5,8,7)) OR (field_id ='20' AND value IN(73,76)) 
0

您應該使用OR,但這兩個子條件之間:

SELECT * 
FROM `engine4_user_fields_values` 
WHERE (field_id ='17' AND value IN(5,8,7)) 
OR (field_id ='20' AND value IN(73,76)) 
0

您正在使用+爲FIELD_ID = '17' AND值IN(5,8,7)+ FIELD_ID = '20' AND值IN(73,76)
因此從技術上講是不可能有FIELD_ID = '17' AND FIELD_ID = '20' 在同一時間
你需要使用OR代替AND如下

SELECT * FROM `engine4_user_fields_values` WHERE (field_id ='17' AND value IN(5,8,7)) OR (field_id ='20' AND value IN(73,76))