簡體   English   中英

如何在MySQL中加入這些數據?

[英]How to join this data in MySQL?

如果我有這樣的表格:

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)並創建一個新的TableD第一行是1 | 2。

有沒有可以執行某些連接的查詢或者能夠執行此操作而無需以編程方式遍歷TABLEB的所有行,然后所有TABLEC行生成所需的TABLED?

您將需要JOINtablea兩次與tableb

  • husband > object和另一個,
  • 一個為wife > object

這樣你就可以把丈夫和妻子的兩個ids放在同一排。

Tablec相同的tablea 然后使用UNION (隱式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.缺少行4 | 1 | 4 | related 4 | 1 | 4 | related 4 | 1 | 4 | related ,因為keyll沒有greg (id 1)和keyll (id 4)的tableb 正如你在問題中解釋的那樣。

  • 新列id是自動增量id,從結果集生成,不從表中選擇。


如果您需要從此選擇中創建一個全新的表,請使用以下語法:

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

你將有一個新的表tabled具有這種結構相同的SELECT

就像在這個更新的小提琴。

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';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM