1

我有一个结构的 sql 表

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 value 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))

如果我们使用 OR 那么它将选择满足任何条件的值。

我们应该使用 join 吗?我不确定代码!任何人请帮我获取选择查询

4

4 回答 4

1

从您的描述看来,您应该将中间的 AND 更改为 OR。您想要返回匹配第一个条件或第二个条件的所有行。字段 ID 不能为 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))
于 2012-12-13T10:13:44.747 回答
1

您可以group byitem 并使用having子句来要求 item 具有匹配两个条件的行:

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
于 2012-12-13T10:16:57.667 回答
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))
于 2012-12-13T10:15:26.637 回答
0

您正在使用 + for field_id ='17' AND value IN(5,8,7)+field_id ='20' AND values 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))
于 2012-12-13T10:18:21.510 回答