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のすべての行から反復を開始します。
  • 3番目の列はrelated、選択されているテーブルがTableBであるlikes場合であり、処理されているテーブルがTABLEBである場合です。

サンプルロジックは次のようになります。

(夫)gregと妻(mary)の最初の行を見るとTABLEB、TABLEAから検索して、gregが行1(id 1)にあり、maryが行2(id 2)にあることを確認し、最初の行は1です| 2.2。

TABLEBのすべての行、次にTABLECのすべての行をプログラムで反復して目的のTABLEDを生成することなく、結合を実行できるクエリや、これを実行できるクエリはありますか?

4

2 に答える 2

1

あなたは:で2回JOINテーブルに行く必要があります:tableatableb

  • 1つはhusband>objectで、もう1つは
  • wife >用に1つobject

同じ行に夫と妻の2つのIDを取得できるようにします。

Tablecと同じtableaです。次に、UNION(暗黙的に区別する)またはを使用UNION ALLして、2つの結果セットを結合します。

何かのようなもの:

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です。に(id 1)と(id 4)4 | 1 | 4 | relatedのエントリがないため、行がありません。あなたがあなたの質問で説明したように。gregkeylltableb

  • 新しい列idは自動増分IDであり、結果セットから生成されます。テーブルからは選択されません。


この選択から新しいテーブルを作成する必要がある場合は、次の構文を使用します。

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

tabledこれと同じ構造を持つ新しいテーブルが作成されます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 に答える