我有一个类似的查询:
SELECT * FROM table WHERE id=1 AND (field1=1 OR field2=1 OR field3=1 OR field4=1 OR field5=1 OR field6=1 OR field7=1 OR field8=1)
实际查询较长,括号中有超过25个字段...
我如何确保至少有两个字段= 1?如果那些是行,那将很容易,但是列呢?不确定它是否可能。
基本上我只有在至少有两个匹配的字段时才需要运行php函数。然后,该功能会更新所选字段,以便下次不再选择它们。
答案 0 :(得分:4)
在MySQL中,可以直接评估条件语句,如果它们为真则返回“1”,如果为假则返回“0”。所以在这种情况下,你可以像这样总结条件:
SELECT * FROM table WHERE id=1 AND (field1=1) + (field2=1) + (field3=1) + (...) >= 2
如果总和等于或大于2,则至少两个字段的值为“1”。请注意,您必须在此处放置括号括号以确保它们被单独评估;否则它无法正确解析。
在一般情况下,还有MySQL的IF功能。你可以在这里使用它:
SELECT * FROM table WHERE id=1 AND IF(field1=1, 1, 0) + IF(field2=1, 1, 0) + IF(field3=1, 1, 0) + (...) >= 2
IF()有三个参数。第一个是条件。如果条件为真,则第二个是返回值。第三个是条件为假的返回值。所以这也可以,因为在MySQl中,裸条件的值等于IF(conditional, 1, 0)
的值。
答案 1 :(得分:3)
也许你可以通过一个关系添加另一个列或另一个表,该关系将包含那些包含1值的字段的计数。显然,必须有一些INSERT / UPDATE逻辑,它可以在对现有表的每次更新时执行此操作,也可以在事务中执行:BEGIN UPDATE ...; SELECT FROM表WHERE id = 1和fields_containing_one> 2; COMMIT(以确保隔离任何赛车更新或在您的UPDATE逻辑和您想要的查询之间插入。
我默认假设你的fieldN值可以是0和1以外的数字,并且你只查找精确== 1的那些。如果你知道fieldN值只有0或1那么你可以可能只使用所有fieldN值的SUM。
总的来说,听起来您的表/架构是非规范化的,并且在您继续使用此数据库时可能会导致其他问题。您可以通过使用两列(field_num或attribute_name以及相应的值)来规范化架构,而不是将field1,field2,...用于数据集的每一行。然后代替给定实体的N个字段的一行,每个实体有N行...每个(KEY)+(fieldN,value)元组一个。
在该模式下,您可以添加约束UNIQUE(无论您的现有密钥是+ field_name)(以确保每个实体的每个类型的“field_name”行不超过一个)。
如果那是您的架构,那么您可以执行以下操作:SELECT id FROM(SELECT table WHERE id = 1 AND value = 1)WHERE COUNT(id)> 1(换句话说,在查询中使用子SELECT子句。
答案 2 :(得分:0)
通过将fields1..8加在一起并查看,如果结果大于等于2则应该做到这一点。