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 和 name:

  • status一个表中的为 2
  • 第二department_id个表中的 等于一个值,在这种情况下,选择第一个表 id 等于第二个表 user_id

重新制定:
查询必须符合以下条件之一:

  • a.status='2'=> 检索 a.name 和 a.id
  • a.department_id=value => 检索 a.id 和 a.name 其中 a.id=b.user_id

但我无法检索任何记录。

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 的原始数据。

在与 deparment_id=? 的所有原始数据联合之后(并检查该用户是否存在)。

在那之后。

由于 mysql planner 的问题,这很可能是最佳的(如果您有关于 status 和 deparment_id 的索引)

于 2013-05-19T11:04:00.797 回答