【发布时间】:2016-08-22 22:10:49
【问题描述】:
我有两张桌子。一个是物品,一个是 ebay 列表。 给定项目可以有多个 ebay 列表。
我有一个视图,它从包括 ebay 表在内的多个表中聚合(左连接)一堆定价信息。
e.custom_label 将以i.id 开头,但不保证完全匹配。
SELECT i.id, i.price AS master_price, e.price AS ebay_price
FROM items i
LEFT JOIN ebay e ON ((e.custom_label LIKE CONVERT(concat(i.id,'%') using latin1)))
这大大简化了,但应该描述问题。
正如预期的那样,由于有多个与 ON 语句匹配的 ebay 列表,你会得到类似
item master_price ebay_price
1234 29.95 29.95
1235 36.95 29.95
1235 36.95 29.95
通常我们会使用子查询来代替连接中的ebay 表来过滤掉重复项,但是由于这是一个视图,所以我们不能。这使我们无法在连接表上进行分组。有没有其他方法可以过滤掉重复项,以使基表可以从视图中编辑?
对于这种观点,获得价格(并且知道该产品在 ebay 上列出)比确保所有 ebay 价格相同更重要,所以我只需要一行。 UI 依赖于每个项目只有一行。
【问题讨论】:
-
为什么不能在视图中使用子查询?你试过了吗?长话短说,你试过
GROUP BY item吗? -
在您在 MySQL 中创建视图的道路上走得太远之前,我建议您确保您了解大型表的性能影响...来自外部查询的谓词不会被推入视图查询,并且视图查询的结果始终被具体化为没有索引的派生表。 (最新版本的 MySQL 部分解决了派生表上缺少索引的问题。)危险,Will Robinson。危险!
-
a) 您是否尝试过
group by itemb) 您可以在视图中使用子查询,但出于所有目的 - 子查询与JOIN完全相同 - 因此,无论您可以通过子查询来实现——你可以用JOIN来做同样的事情。 c) 你没有指定使用的 MySQL 版本 d) 如果那些 ebay 价格对于同一个项目总是相同的,你为什么首先将它多次存储在表中?唯一索引和ON DUPLICATE KEY UPDATE确实很神奇(甚至INSERT IGNORE也会帮助你)。 -
@N.B.向整个查询添加 group by 确实可以解决问题,但会破坏编辑。不能使用 group by 的视图来更新表格。