我相信这个问题有一个简单的解决方案,但我在解决这个问题时遇到了一些麻烦。
背景
我有一个具有以下模式的表(经过删节,因为实际上数据是由多个表的联接创建的):
Order | Item | Shipped
1 1 N
1 2 N
2 1 N
2 5 N
5 6 N
5 2 N
...
模式说明:
- 每一行都由一个订单+项目唯一标识,但这并不是一个主键
- 此外,表上没有主键,我也不能添加主键(MySQL DB是来自遗留系统的盲转储)
问题
我需要一种方法来将Shipped
列设置为'Y'
,如果订单+项目对不存在于订单+项目配对的列表中。
换句话说,我将在其他地方有一个PHP脚本,生成类似(为了可读性而编辑)的内容:
array(
'Order1' => array(1),
'Order5' => array(2, 6)
);
当我运行查询时,我应该得到以下表结构:
Order | Item | Shipped
1 1 N
1 2 Y
2 1 Y
2 5 Y
5 6 N
5 2 N
...
的"直观"解决方案
UPDATE MyTable
SET Shipped='Y'
WHERE
Order NOT IN (1, 5)
AND Item NOT IN (1, 2, 6);
显然不起作用(因为它不会将订单#2中的项目#1标记为已发货)。
应该是这个
UPDATE MyTable
SET Shipped='Y'
WHERE (order, item) not in((1,2), (2,1)... )
((1,2),(2,1)…)==您的列表。。可能是正确选择或正确字符串的结果
您可以根据输入数组创建条件列表:
UPDATE MyTable
SET Shipped='Y'
WHERE NOT
(
( Order = 1 AND Item IN (1))
OR
( Order = 5 AND Item IN (2,6))
)