我有这个mysql查询,问题是没有考虑NOT IN
我正努力实现以下目标。我不会从我的数据库中获取产品
以下是一些示例数据:
CREATE TABLE shop_products (
product_id int,
stock_invoice_based int,
deleted varchar(50),
warehouse_row varchar(50),
warehouse_column varchar(50),
warehouse_ledge varchar(50),
warehouse_id varchar(50)
);
INSERT INTO shop_products (product_id, stock_invoice_based, deleted, warehouse_row, warehouse_column, warehouse_ledge, warehouse_id)
VALUES
(1, 0, "false", "", "", "", ""),
(2, 0, "false", "a", "", "", ""),
(3, 0, "false", "", "b", "", ""),
(4, 0, "false", "", "", "c", ""),
(5, 0, "false", "", "", "", 1);
同样是小提琴SQL fiddle
这是期望的结果:
+------------+---------------+------------------+-----------------+--------------+
| product_id | warehouse_row | warehouse_column | warehouse_ledge | warehouse_id |
+------------+---------------+------------------+-----------------+--------------+
| 3 | | b | | |
| 4 | | | c | |
| 5 | | | | 1 |
+------------+---------------+------------------+-----------------+--------------+
这是我的查询
SELECT `product_id`, `warehouse_row`, `warehouse_column`, `warehouse_ledge`, `warehouse_id`
FROM (`shop_products`)
WHERE (`shop_products`.`stock_invoice_based` = 0 AND `shop_products`.`deleted` = 'false' AND `shop_products`.`product_id` NOT IN (42,45,46,48,52,82,86,123,173,176,181,196,196,202))
AND `warehouse_row` <> ''
OR `warehouse_column` <> ''
OR `warehouse_ledge` <> ''
OR `warehouse_id` <> ''
我当前的问题是mysql还返回product_id为45、48等的产品...因此,我的shop_products .
product_id` NOT IN不被考虑在内
请帮助我解决我的问题。如果您需要任何其他信息,请告诉我,我会提供。谢谢
答案 0 :(得分:3)
看起来您的OR条件缺少括号。否则,如果任何OR
条件为真(例如warehouse_column <> ''
),则WHERE子句为true
SELECT `product_id`, `warehouse_row`, `warehouse_column`, `warehouse_ledge`, `warehouse_id`
FROM (`shop_products`)
WHERE (`shop_products`.`stock_invoice_based` = 0 AND `shop_products`.`deleted` = 'false' AND `shop_products`.`product_id` NOT IN (42,45,46,48,52,82,86,123,173,176,181,196,196,202))
AND
(
`warehouse_row` <> ''
OR `warehouse_column` <> ''
OR `warehouse_ledge` <> ''
OR `warehouse_id` <> ''
)
答案 1 :(得分:1)
您需要一些额外的括号!
您需要以下内容:
SELECT `product_id`, `warehouse_row`, `warehouse_column`, `warehouse_ledge`, `warehouse_id`
FROM (`shop_products`)
WHERE (`shop_products`.`stock_invoice_based` = 0 AND `shop_products`.`deleted` = 'false' AND `shop_products`.`product_id` NOT IN (42,45,46,48,52,82,86,123,173,176,181,196,196,202))
AND ( `warehouse_row` <> ''
OR `warehouse_column` <> ''
OR `warehouse_ledge` <> ''
OR `warehouse_id` <> '')
答案 2 :(得分:1)
请注意,如果您打字次数少,则可以...
SELECT product_id
, warehouse_row
, warehouse_column
, warehouse_ledge
, warehouse_id
FROM shop_products p
WHERE p.stock_invoice_based = 0
AND p.deleted = 'false'
AND p.product_id NOT IN (42,45,46,48,52,82,86,123,173,176,181,196,196,202)
AND '' NOT IN(warehouse_row,warehouse_column,warehouse_ledge,warehouse_id)
(这对否定逻辑进行了假设,可能不正确!)