0

JOINメソッドを使うのはこれが初めてで、うまくいきません。私はこのテーブル($SupportUserTable$SupportUserPerDepaTable)を持っています:

CREATE TABLE IF NOT EXISTS `razorphyn_support_user_departments` (
`id`                BIGINT(11)  UNSIGNED    NOT NULL    AUTO_INCREMENT,
`department_id`     BIGINT(11)  UNSIGNED    NOT NULL,
`department_name`   VARCHAR(70)             NOT NULL,
`user_id`           BIGINT(11)  UNSIGNED    NOT NULL,
`holiday`           ENUM('0','1')           NOT NULL    DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY(`department_name`,`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;

この

CREATE TABLE IF NOT EXISTS `razorphyn_support_users` (
`id`                BIGINT(11)  UNSIGNED        NOT NULL AUTO_INCREMENT, 
`name`              VARCHAR(50)                 NOT NULL,   
`mail`              VARCHAR(50)                 NOT NULL,   
`password`          VARCHAR(200)                NOT NULL,
`reg_key`           VARCHAR(260)                NOT NULL,
`tmp_password`      VARCHAR(31)                 NULL,
`ip_address`        VARCHAR(50)                 NOT NULL,
`status`            ENUM('0','1','2','3','4')   NOT NULL    DEFAULT '3',
`holiday`           ENUM('0','1')               NOT NULL    DEFAULT '0',
`mail_alert`        ENUM('no','yes')            NOT NULL    DEFAULT 'yes',
`assigned_tickets`  INT(5)  UNSIGNED            NOT NULL    DEFAULT 0,
`solved_tickets`    BIGINT(11)  UNSIGNED        NOT NULL    DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY(`mail`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=55;

これは私が書いたものです。

SELECT a.id,a.name  
FROM ".$SupportUserTable." a 
INNER JOIN ".$SupportUserPerDepaTable." b 
ON (a.id=b.user_id)  
WHERE  a.status='2' OR b.department_id=? 
ORDER BY a.status ASC, a.name ASC

基本的に、最初のテーブルからすべての ID と名前を取得したいと考えています。

  • 最初のstatus表の は 2 です
  • 2 番目のdepartment_idテーブルの は値に等しい。この場合、2 番目のテーブル user_id と等しい最初のテーブル ID を選択する

再定式化:
クエリは、次の条件のいずれかに一致する必要があります。

  • a.status='2'=> a.name と a.id を取得する
  • a.department_id=value => a.id=b.user_id の a.id と a.name を取得します

しかし、レコードを取得できません。

4

1 に答える 1

2

最適なクエリ (mysql のみ) は次のようになります。

select distinct id,name from 
 (
  SELECT a.id,a.name  
   FROM ".$SupportUserTable." a 
   WHERE  a.status='2' 
  UNION (
   SELECT a.id,a.name  
     FROM  ".$SupportUserPerDepaTable." b 
     left JOIN  ".$SupportUserTable." a
          ON a.id=b.user_id  
     WHERE b.department_id=? and  a.id is not null
   )
) as  tab 
ORDER BY tab.id ASC, tab.name ASC

したがって、最初にステータス 2 のすべての raw が取得されます。

その後、 deparment_id=? を持つすべての raw との結合 (およびユーザーが存在することを確認します)。

そのような後。

mysql プランナーの問題により、これが最適である可能性が最も高いです (status と deparment_id にインデックスがある場合)。

于 2013-05-19T11:04:00.797 に答える