-1

私のmysqlデータベースに対して次のクエリがあります。

SELECT
  mn.id,
  mn.created_date,
  mn.created_by,
  mnt.description,
  u.handle,
  mn.admin_request_company_id
FROM member_notification mn,
  member_notification_type mnt,
  member m,
  user u
WHERE mn.member_notification_type_id = mnt.id
    AND mnt.name = 'COMPANYVALIDATION'
    AND mn.created_by = m.id
    AND m.user_id = u.id;

これは正常に機能していますが、これを拡張して別のテーブルから会社名を取得する必要があります。問題は、それを行うには、キー mn.admin_request_company_id を使用してメンバー テーブルに対して再結合する必要があることですが、これについてどうすればよいかわかりません。

メンバー m2 テーブルを作成しようとしましたが、エラーが発生します。私が達成しようとしているのは、次の擬似コードの行に沿ったものです。

SELECT
  mn.id,
  mn.created_date,
  mn.created_by,
  mnt.description,
  u.handle,
  mn.admin_request_company_id,
  /*c.company_name*/
FROM member_notification mn,
  member_notification_type mnt,
  member m,
  /*member m2,*/
  /*company c,*/
  /*user u*/
WHERE mn.member_notification_type_id = mnt.id
    AND mnt.name = 'COMPANYVALIDATION'
    AND mn.created_by = m.id
    AND m.user_id = u.id
   /* AND mn.admin_request_company_id = m2.company_id
    AND m2.company_id = c.id*/

次のようにテーブル構造を編集します。

CREATE TABLE member_notification (
id INT NOT NULL AUTO_INCREMENT,
item_id INT NULL,
member_id INT NULL,
text VARCHAR(1) NOT NULL,
member_notification_type_id INT NULL,
marked_read VARCHAR(1) NOT NULL,
created_date DATETIME NOT NULL,
created_by VARCHAR(50) NOT NULL,
admin_request_company_id INT NULL,
PRIMARY KEY (id)
) ENGINE=innodb;

CREATE TABLE member_notification_type (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
description VARCHAR(50) NULL,
PRIMARY KEY (id)
) ENGINE=innodb;

CREATE TABLE member (
id INT NOT NULL AUTO_INCREMENT,
user_id INT NULL,
company_id INT NULL,
soft_delete VARCHAR(10) DEFAULT 'N',
member_status_id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=innodb;


CREATE TABLE user (
id INT NOT NULL AUTO_INCREMENT,
handle VARCHAR(50) NOT NULL,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
date_of_birth VARCHAR(50) NULL,
soft_delete VARCHAR(10) DEFAULT 'N',
PRIMARY KEY (id)
) ENGINE=innodb;

CREATE TABLE company (
id INT NOT NULL AUTO_INCREMENT,
owning_company_id INT NULL,
company_type_id INT NULL,
name VARCHAR(50) NOT NULL,
company_details_id INT NULL,
PRIMARY KEY (id)
) ENGINE=innodb;
4

3 に答える 3

2

memberテーブルに2番目の結合を追加するだけの次のものを使用したいだけのようです:

SELECT
  mn.id,
  mn.created_date,
  mn.created_by,
  mnt.description,
  u.handle,
  mn.admin_request_company_id,
  c.name
FROM member_notification mn
INNER JOIN member_notification_type mnt
  on mn.member_notification_type_id = mnt.id
INNER JOIN member m1
  on mn.created_by = m1.id
INNER JOIN user u
  on m1.user_id = u.id
INNER JOIN member m2
  on mn.admin_request_company_id = m2.company_id
INNER JOIN company c
  on m2.company_id = c.id
WHERE mnt.name = 'COMPANYVALIDATION'

句の現在の結合WHEREを ANSI 結合構文に変更したことに注意してください。テーブル間に も使用しましたINNER JOINが、 を使用する必要があるかもしれませんLEFT JOIN

于 2013-01-22T11:04:47.720 に答える
1

これがあなたがそれを行う方法です

SELECT
  mn.id,
  mn.created_date,
  mn.created_by,
  mnt.description,
  u.handle,
  mn.admin_request_company_id
FROM member_notification mn
  left join member_notification_type mnt
    on mnt.id = mn.member_notification_type_id
  left join member m
    on m.id = mn.created_by
  left join user u
    on u.id = m.user_id
  left join company as c
    on c.id = m.company_id
where mnt.name = 'COMPANYVALIDATION'
于 2013-01-22T11:08:25.767 に答える
1

テーブルで 2 回結合するには、別の名前を使用してテーブルを 2 回選択します。

SELECT
  ...
FROM 
  member m1,
  member m2,
  someCouplingTable t
WHERE
  m1.Id = t.leftId
  AND m2.Id = t.rightId
于 2013-01-22T11:00:36.457 に答える