在视图中防止mysql连接中的重复项

时间:2016-08-22 22:10:50

标签: mysql join

我有两张桌子。一个是项目,一个是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语句匹配的易趣物品清单,您将获得类似

的内容
item   master_price    ebay_price
1234       29.95          29.95
1235       36.95          29.95
1235       36.95          29.95  

通常我们会使用子查询代替连接中的ebay tabel来过滤掉重复项,但由于这是一个视图,我们不能。这使我们无法在联接表上进行分组操作。有没有其他方法来过滤掉重复项,以保持基表可以从视图中编辑?

对于这种观点,获取价格(并知道产品在ebay上列出)比确保所有ebay价格相同更重要,所以我只需要一行。 UI依赖于每个项目只有一行。

1 个答案:

答案 0 :(得分:0)

我认为您可以在SELECT列表中使用相关子查询,因为您只拉了一列。 (我会在关于这个问题的评论中重复这个警告...... 危险,威尔罗宾逊,危险!

我没有把我的大脑缠绕在连接谓词上,应该做什么......

//main

import React from 'react';
import { Link } from 'react-router';

const Main = React.createClass({
  render() {
    return (
      <div>
        <h1>
          <Link to="/">Reduxstagram</Link>
        </h1>
        {React.cloneElement(this.props.children, this.props)}
      </div>
    )
  }
});

export default Main;

i.id = ((e.custom_label LIKE CONVERT(concat(i.id,'%') using latin1))) 将返回一个布尔值。值TRUE,FALSE或NULL。在数值上下文中进行求值,布尔值将为1,0或NULL。然后获取该结果,并对e.custom_label LIKE foo列进行相等比较...我没有得到它,对于除1或0之外的任何id值,整个表达式将如何计算为TRUE。

但话说回来,id第一部分匹配的整个业务对我来说似乎很奇怪。

ebay中的哪些行应该匹配哪个item.id值,给出如下内容:

custom_label

但除了整个业务......

我不确定为什么SELECT列表中的相关子查询不适合你。举个例子。 (在相关子查询的WHERE子句中使用所需的“匹配条件”。)

 item.id
 -------
      12
     123

 ebay.custom_label
 -----------------
 122
 123
 1234
 12345

存储的视图定义可能存在一些限制。 (对存储的视图定义没有多少经验。由于可以引入的各种问题,我们只是避免创建存储的视图定义。这些问题可能比存储的视图定义解决的问题大得多。)