Mysql 显示共享来自同一属性的2个值的ID
我试图从同一属性列中获取掌握2个值(MySQL和Python)的人员的枚举(员工编号),我得到的最接近的值在下面,但枚举是重复的。我只想得到一次枚举。我想我把WHERE条款搞砸了。。。我不知道Mysql 显示共享来自同一属性的2个值的ID,mysql,sql,Mysql,Sql,我试图从同一属性列中获取掌握2个值(MySQL和Python)的人员的枚举(员工编号),我得到的最接近的值在下面,但枚举是重复的。我只想得到一次枚举。我想我把WHERE条款搞砸了。。。我不知道 mysql> select * from employee_expert; +------+---------+ | eNum | package | +------+---------+ | E246 | Excel | | E246 | MySQL | | E246 | Python
mysql> select * from employee_expert;
+------+---------+
| eNum | package |
+------+---------+
| E246 | Excel |
| E246 | MySQL |
| E246 | Python |
| E246 | Word |
| E403 | Jave |
| E403 | MySQL |
| E892 | Excel |
| E892 | PHP |
| E892 | Python |
+------+---------+
mysql> SELECT eNum, package
FROM employee_expert
WHERE (package = 'MySQL' OR package = 'Python') AND (package = 'MySQL' OR package = 'Python')
GROUP BY package;
+------+---------+
| eNum | package |
+------+---------+
| E246 | MySQL |
| E246 | Python |
+------+---------+
我觉得问题出在设计本身,想想看,一个员工可以掌握很多包,一个包可以被很多员工掌握,这是一种多对多的关系,在数据库方面,将生成一个表
employee\u包
,例如,其中包含由每个表的主键组成的主键
+------+------------+
| eNum | package_id |
+------+------------+
| E246 | 1 |
| E246 | 2 |
| E246 | 3 |
| E892 | 1 |
+------+------------+
那么您的请求将类似于:
SELECT DISTINCT e.eNum from employees e JOIN employee_package ep on ep.eNum = e.eNum
WHERE ep.package_id = 1 OR ep.package_id = 2
-- let's say that id 1 is for MySQL and id 2 is for Python
WHERE
子句包含不必要的条件重复package='MySQL'或package='Python'
。使用WHERE(package='MySQL'或package='Python')
就足够了。或者,为了提高可读性,您可以在('MySQL','Python')中编写WHERE包
您的查询选择知道“MySQL”或“Python”或两者的员工
看起来您想要选择既知道“MySQL”又知道“Python”的员工。为此,您需要使用JOIN
:
SELECT f.eNum
FROM employee_expert f # 'f' from 'first'
INNER JOIN employee_expert s USING(eNum) # 's' from 'second'
WHERE f.package = 'MySQL'
AND s.package = 'Python'
不幸的是,如果您需要使用更大的语言集进行查找,那么这种方法的可扩展性不是很好。更好的方法是使用原始查询并按eNum
将结果分组,如下所示:
SELECT eNum, COUNT(DISTINCT package) AS nbLangs
FROM employee_expert
WHERE package IN ('MySQL', 'Python') # <------------------------------------+
GROUP BY eNum # Make one entry for each employee |
HAVING nbLangs = 2 # Replace '2' with the number of items in this list --+
选择枚举,将(不同的包)计数为nbLangs
来自员工和专家
WHERE package IN('MySQL','Python')#此查询从列表中选择至少懂一种语言的员工。OP希望选择懂两种语言的员工(或者,至少我是这样理解这个问题的)。