MySQL分组OR和and子句

MySQL分组OR和and子句,mysql,Mysql,因此,生产者表模式如下所示: producer_id = int PK producer_name = varchar is_restaurant = boolean is_farm = boolean is_distributor = boolean 我想要一个这样的查询: 选择其生产者id为的所有生产者 位于(118951197611457)中 要么是农场,要么是餐馆,要么是餐馆 经销商 我有这个: SELECT `pd`.`producer_id` AS producer_id, `pd

因此,生产者表模式如下所示:

producer_id = int PK
producer_name = varchar
is_restaurant = boolean
is_farm = boolean
is_distributor = boolean
我想要一个这样的查询:

选择其生产者id为的所有生产者 位于(118951197611457)中 要么是农场,要么是餐馆,要么是餐馆 经销商

我有这个:

SELECT `pd`.`producer_id` AS producer_id, `pd`.`producer` AS producer, `pd`.`is_restaurant`, `pd`.`is_restaurant_chain`, `pd`.`is_farm`, `pd`.`is_farmers_market`, `pd`.`is_distributor`, `pd`.`is_manufacture`, `ad`.`address_id`, `ad`.`address`, `ad`.`state_id`, `ad`.`city`, `ad`.`city_id`, `ad`.`country_id`, `ad`.`zipcode`, `ad`.`latitude`, `ad`.`longitude`, `cu`.`custom_url` AS custom_url
FROM (`producer` AS pd)
JOIN `address` AS ad ON `pd`.`producer_id`=`ad`.`producer_id`
LEFT JOIN `custom_url` AS cu ON `cu`.`producer_id`=`pd`.`producer_id`
WHERE `is_farm` = 1
OR `is_distributor` = 1
OR `is_restaurant` = 1
AND `pd`.`producer_id` IN ('181176', '181180', '176080', '5') 
GROUP BY `ad`.`address_id`
LIMIT 10
但查询仅适用于is_farm、is_distributor和is_restaurant的WHERE条件,而不适用生产者id的and子句

我想知道是否可以使用子查询来执行“餐厅是分销商还是农场”,然后在查询中插入and子句


如何解决这个问题?

您的问题是,在SQL中,
优先于
,所以您只需要括号:

SELECT `pd`.`producer_id` AS producer_id, `pd`.`producer` AS producer, `pd`.`is_restaurant`, `pd`.`is_restaurant_chain`, `pd`.`is_farm`, `pd`.`is_farmers_market`, `pd`.`is_distributor`, `pd`.`is_manufacture`, `ad`.`address_id`, `ad`.`address`, `ad`.`state_id`, `ad`.`city`, `ad`.`city_id`, `ad`.`country_id`, `ad`.`zipcode`, `ad`.`latitude`, `ad`.`longitude`, `cu`.`custom_url` AS custom_url
FROM (`producer` AS pd)
JOIN `address` AS ad ON `pd`.`producer_id`=`ad`.`producer_id`
LEFT JOIN `custom_url` AS cu ON `cu`.`producer_id`=`pd`.`producer_id`
WHERE (`is_farm` = 1 -- NOTE: Opening bracket to bracket up your OR terms together
OR `is_distributor` = 1
OR `is_restaurant` = 1) -- NOTE: Closing bracket
AND `pd`.`producer_id` IN ('181176', '181180', '176080', '5') 
GROUP BY `ad`.`address_id`
LIMIT 10
推论:

在SQL中,A或B或C和D被解析为
(A或(B或(C和D))
。应用括号将更正此常见错误,即
(A或B或C)和D


记住:当混合
以及
术语时,请始终使用括号

这应该可以做到:

SELECT `pd`.`producer_id` AS producer_id, `pd`.`producer` AS producer, `pd`.`is_restaurant`, `pd`.`is_restaurant_chain`, `pd`.`is_farm`, `pd`.`is_farmers_market`, `pd`.`is_distributor`, `pd`.`is_manufacture`, `ad`.`address_id`, `ad`.`address`, `ad`.`state_id`, `ad`.`city`, `ad`.`city_id`, `ad`.`country_id`, `ad`.`zipcode`, `ad`.`latitude`, `ad`.`longitude`, `cu`.`custom_url` AS custom_url
FROM (`producer` AS pd)
JOIN `address` AS ad ON `pd`.`producer_id`=`ad`.`producer_id`
LEFT JOIN `custom_url` AS cu ON `cu`.`producer_id`=`pd`.`producer_id`
WHERE `pd`.`producer_id` IN ('181176', '181180', '176080', '5')
AND (`is_distributor` = 1 OR `is_restaurant` = 1 OR `is_farm` = 1)
GROUP BY `ad`.`address_id`
LIMIT 10

嗯……你知道如何使用CI的活动记录吗?如果你无法控制SQL语法,请尝试创建一个具有额外列的视图:
create view producer\u plus as select*、is_restaurant或is_farm或is_distributor as is_producer from producer
。您仍然可以更新它(因为它不是联接),但您将无法写入课程的计算列。这个答案几乎有点偏离了我的答案,事实上,
在其他语言中优先。@hlev-ummm。。。哎呀!是的,这就是我的意思。不过,我的例子是正确的。我已经纠正了错误。谢谢你让我知道。