MySQL:当对NOT IN列表对时没有更新(没有主键)

时间:2016-03-30 16:39:08

标签: php mysql sql

我确信这个问题有一个简单的解决方案,但是我在解决这个问题时遇到了一些障碍。

背景

我有一个包含以下模式的表(删节,因为实际上数据是由多个表的连接创建的):

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

2 个答案:

答案 0 :(得分:1)

应该是这个

UPDATE MyTable
SET Shipped='Y'
WHERE (order, item) not in((1,2), (2,1)... )

((1,2),(2,1)...)==你的列表..可能是正确选择或正确字符串的结果

答案 1 :(得分:0)

您可以根据输入数组创建条件列表:

UPDATE MyTable
SET Shipped='Y'
WHERE NOT
 ( 
   ( Order  = 1 AND Item IN (1))
  OR
   ( Order  = 5 AND Item IN (2,6))
 )