0

我正在尝试在父子关系中链接帐户

我在帐户表中有帐户,每个帐户都有自己的 ID“主号码”、“group_id”、电话、联系人、电子邮件、传真。

我需要选择所有有父母的帐户。

这是我定义父级的方式:首先,GROUP_ID 必须相同,并且至少满足以下条件之一

  1. 如果地址相同
  2. 如果电话号码相同
  3. 如果传真相同
  4. 如果电子邮件相同
  5. 如果地址的前 6 个字符相同

我创建了一个小提琴来解释我想要做什么 http://sqlfiddle.com/#!2/1974f/5

这是代码

CREATE TABLE accounts(
  id int(11),
  name varchar(255),
  Address1 varchar(255),
  phone varchar(10),
  fax varchar(10), 
  email varchar(255),
  contact varchar(255),
  group_id int(11)
  );
INSERT INTO accounts(id, name, Address1, phone, fax, email, contact, group_id)
VALUES
(1, 'Program 1', '123 Main S','7542116654','7456113354','test@test.com','Blah Blah',10),
(2, 'Program 2', '123 Main South','745123456','7024568984','none@test.com','James',10),
(3, 'Program 100', '4512 1st ave','754219648','7452155546','Jim@test.com','Jim',13),
(4, 'Program 55', '12645 West Industry Ave','7023665520','7981234568','mike@test.com','Mike',15),
(4, 'Program Trop', '465431 E Tropicana Ave','7023665520','7024564546','Jay@test.com','Jay',10);

这是我尝试提取数据

SELECT b.id AS parent, a.* FROM accounts AS a
INNER JOIN(
  SELECT * FROM accounts
) AS b ON a.id= b.id
WHERE
a.address1 = b.address1
OR LEFT(a.Address1 , 6) = LEFT(b.Address1, 6)
OR (a.phone = b.phone AND LENGTH(b.phone) = 10)
OR (a.fax = b.phone AND LENGTH(b.fax) = 10)
OR (a.contact = b.contact AND LENGTH(b.contact) > 5 )
OR (a.email = b.email AND LENGTH(b.email) > 5 )

最终输出应该在 account 表中给我相同的数据,但如果有的话,会有一个父 ID 列。

我怎样才能做到这一点?

4

1 回答 1

0

一个完全符合您要求的查询是:

SELECT
  a1.*, a2.id AS parent
FROM
  accounts a1
  LEFT JOIN accounts AS a2 ON a1.group_id = a2.group_id
    AND (
      a1.Address1 = a2.Address1
      OR a1.phone = a2.phone
      OR a1.fax = a2.fax
      OR a1.email = a2.email
      OR (
        CHAR_LENGTH(a1.Address1) >= 6
        AND CHAR_LENGTH(a2.Address1) >= 6
        AND LEFT(a1.Address1, 6) = LEFT(a2.Address1, 6)
      )
    )

但是,请注意,您的条件意味着帐户始终是其自身的父级,并且如果帐户 A 是帐户 B 的父级,则 B 也是帐户 A 的父级。

您可以通过添加AND a1.id <> a2.id(如果您只想阻止帐户成为自己的父级)或AND a1.id > a2.id(如果您想阻止帐户成为自己的父级并防止关系双向)来防止这种情况发生。

于 2013-08-08T01:06:13.910 回答