从具有内连接和where条件的表中选择记录

时间:2013-05-19 10:34:33

标签: mysql join

这是我第一次使用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
  • 第二个表中的department_id等于一个值,在这种情况下选择第一个表id等于第二个表user_id
重订


查询必须符合以下条件之一:

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

但是我找不到任何记录。

1 个答案:

答案 0 :(得分: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的索引)

相关问题