选择时用另一个表覆盖/连接 MySQL 表

发布于 2024-10-15 23:00:51 字数 1176 浏览 7 评论 0原文

我有两个产品表。表 A 是“默认”表(来自每周自动更新的数据源)。表 B 用于手动覆盖表 A 中的值,并且具有与表相同的列以及更多列。两个表始终具有相同的 UniqueID 列。

我需要一个 select 语句,从 A 中提取所有值,并从 B 中提取所有值,B 覆盖 A 中的值,除非 B 中的值为空,= 为 0 或等于 0.00(列设置为具有 2 个小数点的整数并用“0”填充)。

我尝试使用 LEFT JOIN 但在处理 null 和“0”值时遇到问题。

我正在 php 中使用数据,当我只需要拉入 1 行时就可以处理它。我查询每个,提取 A 的关联数组,过滤 B 数组,然后提取它。但当开始拉入 20-200 行时,该过程变得非常笨拙。

表 A 大约有 400,000 行,看不到 B 超过 10,000-20,000 行。

感谢您的帮助。

更新:这是我要工作的代码。

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) 作为颜色, IF(b.Price1 = 0, a.Price1, b.Price1) 作为 Price1, b.SPrice1 FROM Productdata a LEFT JOIN Product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod"; 更新

2:越简单越好。 IF() 同时处理 null 和 0。

IF(expr1,expr2,expr3)

如果 expr1 为 TRUE(expr1 <> 0 且 expr1 <> NULL),则 IF() 返回 expr2;否则返回 expr3。 IF() 返回数字或字符串值,具体取决于使用它的上下文。

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) 作为颜色, IF(b.Price1, b.Price1, a.Price1) 作为 Price1, b.SPrice1 FROM Productdata a LEFT JOIN Product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

I have two product tables. Table A is the "default" table (comes from data feed is automatically updated weekly). Table B is used to manually overwrite the values in Table A and has the same columns as Table plus a few more. Both tables always have the same UniqueID column.

I need a select statement that pulls all the values from A and all the values from B, with B overwriting the values from A UNLESS the value from B is null, = to 0 or equal to 0.00 (column set to integer with 2 decimal points and been filled with "0").

I tried using a LEFT JOIN but am having trouble with the null and "0" values.

I am using the data in php and can deal with it when I only need to pull in 1 row. I query for each, extract the assoc array for A, filter the B array and then extract it. But that process becomes very clunky when start to pull in 20-200 rows.

Table A has about 400,000 rows and can't see B getting over 10,000-20,000.

Thanks for your help.

UPDATE: Here is the code I got to work.

SELECT a.UniqueId,
IF(b.Color, b.Color, a.Color) as Color,
IF(b.Price1 = 0, a.Price1, b.Price1) as Price1,
b.SPrice1
FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

UPDATE 2: So simple is better. IF() addresses both null and zero.

IF(expr1,expr2,expr3)

If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2; otherwise it returns expr3. IF() returns a numeric or string value, depending on the context in which it is used.

SELECT a.UniqueId,
IF(b.Color, b.Color, a.Color) as Color,
IF(b.Price1, b.Price1, a.Price1) as Price1,
b.SPrice1
FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傲世九天 2024-10-22 23:00:51

我认为这可以涵盖您的所有场景:

SELECT 
   COALESCE(b.nullablefield, a.nullablefield) as nullablefield,
   IF(b.intfield = 0, a.intfield, b.intfield) as intfield,
   IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield,
   ... etc ...
FROM table_a a
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID

I think this aught to cover all your scenarios:

SELECT 
   COALESCE(b.nullablefield, a.nullablefield) as nullablefield,
   IF(b.intfield = 0, a.intfield, b.intfield) as intfield,
   IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield,
   ... etc ...
FROM table_a a
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文