ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

php – 使用MySQL,不选择存在于不同表中的用户的最佳方法是什么?

2019-07-26 01:14:10  阅读:158  来源: 互联网

标签:php mysql join subquery combobox


我的问题如下:
我有两张桌子;个人和团队,我想选择所有person_id = 2的人,这些人存在于团队中而不是团队中.

表团队为团队负责人存储哈希值,团队负责人一次只能领导一个团队.在创建团队时,我只想向管理员展示当前没有领导团队的人员,基本上排除所有已经是任何特定团队领导者的人.

我的结构如下:

mysql> desc persons;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| firstname   | varchar(9)  | YES  |     | NULL    |       |
| lastname    | varchar(10) | YES  |     | NULL    |       |
| role_id     | int(2)      | YES  |     | NULL    |       |
| hash        | varchar(32) | NO   | UNI | NULL    |       |
+-------------+-------------+------+-----+---------+-------+

mysql> desc teams;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| id     | int(11)     | NO   | PRI | NULL    | auto_increment |
| name   | varchar(20) | YES  |     | NULL    |                |
| leader | varchar(32) | NO   |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

我目前的SQL如下:

SELECT CONCAT(  `persons`.`firstname` ," ",  `persons`.`lastname` ) AS  `manager`,
`hash` FROM  `persons`
WHERE  `persons`.`role_id` =2 AND  `persons`.`hash` != 
(SELECT  `leader` FROM  `teams` );

后面的SQL Query在表团队只有1条记录的情况下工作,但是一旦我添加另一条记录,MySQL会对子查询产生两条记录的投诉.

在WHERE子句中,我还尝试了以下方法,而不是子查询:

 WHERE `persons`.`role_id` = 2 AND `persons`.`hash` != `teams`.`leader`

但后来它抱怨表格团队中没有列专栏

我也在考虑使用某种逆LEFT JOIN,但我还没有想出最佳解决方案.

任何帮助是极大的赞赏!
谢谢

P.S.:如果你想要一个类似于我的场景,这是SQL语句:

DROP TABLE IF EXISTS `teams`;
CREATE TABLE IF NOT EXISTS `teams` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(20) DEFAULT NULL,
   `leader` varchar(32) NOT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

 INSERT INTO `teams` (`id`, `name`, `leader`) VALUES
 (1, 'Team 1', '406a3f5892e0fcb22bfc81ae023ce252'),
 (2, 'Team 2', 'd0ca479152996c8cabd89151fe844e63');


DROP TABLE IF EXISTS `persons`;
CREATE TABLE IF NOT EXISTS `persons` (
  `firstname` varchar(9) DEFAULT NULL,
  `lastname` varchar(10) DEFAULT NULL,
  `role_id` int(2) DEFAULT NULL,
  `hash` varchar(32) NOT NULL,
  PRIMARY KEY `hash` (`hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `persons` (`firstname`, `lastname`, `role_id`,`hash`) VALUES
('John', 'Doe', 2, '406a3f5892e0fcb22bfc81ae023ce252'),
('Jane', 'Doe', 2, 'd0ca479152996c8cabd89151fe844e63'),
('List', 'Me', 2, 'fbde2c4eeee7f455b655fe4805cfe66a'),
('List', 'Me Too', 2, '6dee2c4efae7f452b655abb805cfe66a');

解决方法:

您不需要子查询来执行此操作. LEFT JOIN就足够了:

SELECT
   CONCAT (p.firstname, " ", p.lastname) AS manager
   , p.hash
FROM  persons p
   LEFT JOIN teams t ON p.hash = t.leader
WHERE
   p.role_id = 2
   AND t.id IS NULL -- the trick

标签:php,mysql,join,subquery,combobox
来源: https://codeday.me/bug/20190726/1538998.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有