3

如果我有这样的表:

TABLEA

id| object | type
1 | greg | person
2 | mary | person
3 | jared | person
4 | kelly | person
5 | melissa | person
6 | william | person
7 | skiing | hobby
8 | biking | hobby

TABLEB

id | husband | wife
1 | greg | mary
2 | jared | kelly
3 | william | kelly

TABLEC

id | female | hobby
1 | mary | skiing
2 | kelly | biking

有什么方法可以得到一个结果表:

TABLED

id | a | b | link
1 | 1 | 2 | related
2 | 3 | 4 | related
3 | 6 | 4 | related
4 | 1 | 4 | related
5 | 2 | 7 | likes
6 | 4 | 8 | likes

仅使用 MySQL 查询(/ies)?

  • 逻辑基本上会从表 B 和表 B 的所有行开始迭代。
  • 第三列是related当被选中的表是 时TableB,是likes当正在处理的表是表 B 时。

示例逻辑是:

查看TABLEB(丈夫) greg 和妻子 (mary) 的第一行,它从 TABLEA 向上查找,发现 greg 位于第 1 行 (id 1),而 mary 位于第 2 行 (id 2),并使用第一行是 1 | 2.

是否有一个查询可以执行某些连接或某些操作,而无需以编程方式遍历 TABLEB 的所有行,然后遍历 TABLEC 的所有行以生成所需的 TABLED?

4

2 回答 2

1

您将需要JOIN两次tablea使用tableb

  • 一个用于husband>object另一个,
  • 一个为wife > object

这样就可以在同一行获取夫妻的两个id。

Tablecwith相同tablea。然后使用UNION(implicit distinct) 或UNION ALL合并两个结果集。

就像是:

SELECT
  (@rownum := @rownum + 1) AS id,
  sub.*
FROM
(
  SELECT 
    ah.id     AS a,
    aw.id     AS b,
    'related' AS link
  FROM tableb       AS b
  INNER JOIN Tablea AS ah ON ah.object = b.husband AND ah.type = 'person'
  INNER JOIN Tablea AS aw ON aw.object = b.wife    AND aw.type = 'person'
  UNION ALL
  SELECT
    a.id  AS a,
    a2.id AS b,
    'hobby'
  FROM tablec       AS c
  INNER JOIN tablea AS a  ON a.object  = c.female 
  INNER JOIN tablea AS a2 ON a2.object = c.hobby AND a2.type = 'hobby'
) AS Sub, (SELECT @rownum := 0) AS t;

SQL 小提琴演示

这会给你:

| ID | A | B |    LINK |
------------------------
|  1 | 1 | 2 | related |
|  2 | 3 | 4 | related |
|  3 | 6 | 4 | related |
|  4 | 2 | 7 |   hobby |
|  5 | 4 | 8 |   hobby |

注意:

  • 此查询将只为您提供 5 行,其中您要查找的预期结果集是 6。它缺少 row ,4 | 1 | 4 | related因为在. 正如您在问题中解释的那样。gregkeylltableb

  • 新列id是自动增量 id,从结果集中生成,不是从表中选择的。


如果您需要从此选择创建一个全新的表,请使用以下语法:

CREATE TABLE Tabled
AS
SELECT ...
... -- the same previous select query

并且您将拥有一个tabled具有与 this 相同结构的新表SELECT

就像在这个更新的小提琴中一样。

于 2013-02-02T06:57:17.413 回答
0
create table tabled (
  id int auto_increment,
  a varchar(10),
  b varchar(10),
  link varchar(10));

insert into tabled (a, b, link)
select a1.id a, a2.id b, 'related' link
from tablea a1
join tableb b on a1.object = b.husband and a1.type = 'person'
join tablea a2 on a2.object = b.wife and a2.type = 'person'
union all
select a1.id a, a2.id b, 'likes' link
from tablea a1
join tablec c on a1.object = c.female and a1.type = 'person'
join tablea a2 on a2.object = c.hobby and a2.type = 'hobby';
于 2013-02-02T06:58:19.977 回答