1

我有下表,

餐桌产品

product_id | name 
-----------------------
      1    | product 1 
      2    | Product 2
      3    | Product 3     
      4    | product 4    
      5    | product 5  
      .    | ....
      .    | ....

product_to_zone

product_id | zone_id 
--------------------
     1     | 10 
     1     | 11
     2     | 10    
     2     | 11   

有没有办法为我在product_to_zone表中的所有未分配产品添加zone_id 10,11作为默认值(即 product_id 3,4,5 )

4

6 回答 6

1

可能是这样的:-

SELECT a.product_id, a.name, b.zone_id
FROM products a
INNER JOIN product_to_zone b
ON a.product_id = b.product_id
UNION
SELECT a.product_id, a.name, 10
FROM products a
LEFT OUTER JOIN product_to_zone b
ON a.product_id = b.product_id
WHERE b.product_id IS NULL
UNION
SELECT a.product_id, a.name, 11
FROM products a
LEFT OUTER JOIN product_to_zone b
ON a.product_id = b.product_id
WHERE b.product_id IS NULL

如果您只想添加未分配的,则如下所示:-

INSERT INTO product_to_zone (product_id, zone_id )
SELECT a.product_id, 10
FROM products a
LEFT OUTER JOIN product_to_zone b
ON a.product_id = b.product_id
WHERE b.product_id IS NULL
UNION
SELECT a.product_id, 11
FROM products a
LEFT OUTER JOIN product_to_zone b
ON a.product_id = b.product_id
WHERE b.product_id IS NULL
于 2013-07-12T08:46:27.250 回答
0
INSERT INTO product_to_zone (product_id, zone_id)
SELECT * FROM (SELECT (product_id, '10') FROM product WHERE product_id NOT IN
(SELECT a.product_id from product a JOIN product_to_zone b GROUP BY a.product_id)
 UNION
 SELECT (product_id, '11') FROM product WHERE product_id NOT IN
(SELECT a.product_id from product a JOIN product_to_zone b GROUP BY a.product_id));

这应该得到 product_to_zone 中仍然缺少的所有产品,然后插入到 product_to_zone 中,zone_id 为 10 和 11。

编辑:如果您想为未来的产品自动完成此操作,请为其触发。

CREATE TRIGGER tr_product_to_zone AFTER INSERT ON product
FOR EACH ROW BEGIN
    INSERT INTO product_to_zone (product_id, zone_id)
    VALUES (NEW.product_id, '10');
    INSERT INTO product_to_zone (product_id, zone_id)
    VALUES (NEW.product_id, '11');
END;
于 2013-07-12T08:46:27.950 回答
0

我的回答是指在插入/更新/删除时设置这些默认值,而不是将值设置为其他响应解决的现有记录。

您可以在插入/更新时执行的存储过程中执行此操作,但我建议您在应用程序级别执行此操作(即在 PHP/Perl/Ruby/Python 或任何您的应用程序中编写)。

这是一个相当复杂的业务逻辑,因为以下问题:

  • 当您只有 1 条记录时会发生什么product_to_zone
  • 当您删除 2 条记录中的 1 条时会发生什么product_to_zone
于 2013-07-12T08:52:00.147 回答
0

您可以创建一个程序来插入尚未分配到区域的产品(或创建一个程序来执行不同的操作),例如:

CREATE PROCEDURE assignProductsToZones ()
BEGIN
  DECLARE DECLARE pId INT;
  DECLARE cur1 CURSOR FOR SELECT product_id FROM product p where not exists (select 1 from product_to_zone ptz where p.product_id=ptz.product_id);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur1;

read_loop: LOOP
    FETCH cur1 INTO pId;
    IF done THEN
      LEAVE read_loop;
    END IF;
    INSERT INTO product_to_zone (product_id, zone_id) VALUES (pId,11);
    INSERT INTO product_to_zone (product_id, zone_id) VALUES (pId,12);
  END LOOP;

  CLOSE cur1;
END;

然后只需调用该过程:

CALL assignProductsToZones();

您可能希望安排调用定期运行或在 de products 表中插入新产品时在触发器中使用它。

于 2013-07-12T08:59:00.833 回答
0
INSERT INTO product_to_zone (product_id, zone_id)
SELECT product_id, 10 FROM product WHERE product_id NOT IN (SELECT product_id FROM product_to_zone WHERE zone_id IN (10, 11))
UNION
SELECT product_id, 11 FROM product WHERE product_id NOT IN (SELECT product_id FROM product_to_zone WHERE zone_id IN (10, 11));
于 2013-07-12T09:05:15.860 回答
-2

您可以通过 2 种方式做到这一点:

  • 如果您在 product_to_zone 的两个列上都有唯一索引

INSERT IGNORE into product_to_zone (select product_id, 11 from product);

INSERT IGNORE into product_to_zone (select product_id, 10 from product);

  • 或者如果不是你可以使用上面人的提示
于 2013-07-12T08:51:04.793 回答