gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:50:01 26 4
gpt4 key购买 nike

我的问题如下:我有两张 table ; persons and teams,我想选择所有 role_id = 2 的人,它们存在于 persons teams.

teams 表存储一次只能领导一个 团队的团队领导 的哈希值。在创建团队时,我只是想向管理员显示目前没有领导团队的人,基本上排除所有已经是任何给定团队领导者的人。

我的结构如下:

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 查询在 teams 表只有 1 条记录时有效,但只要我添加另一个记录,MySQL 就会提示子查询产生两条记录。

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

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

但随后它提示表 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,不选择存在于不同表中的用户的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452975/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com