这是我第一次使用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 :
查询必须符合以下条件之一:
但是我找不到任何记录。
答案 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的索引)