Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 显示共享来自同一属性的2个值的ID_Mysql_Sql - Fatal编程技术网

Mysql 显示共享来自同一属性的2个值的ID

Mysql 显示共享来自同一属性的2个值的ID,mysql,sql,Mysql,Sql,我试图从同一属性列中获取掌握2个值(MySQL和Python)的人员的枚举(员工编号),我得到的最接近的值在下面,但枚举是重复的。我只想得到一次枚举。我想我把WHERE条款搞砸了。。。我不知道 mysql> select * from employee_expert; +------+---------+ | eNum | package | +------+---------+ | E246 | Excel | | E246 | MySQL | | E246 | Python

我试图从同一属性列中获取掌握2个值(MySQL和Python)的人员的枚举(员工编号),我得到的最接近的值在下面,但枚举是重复的。我只想得到一次枚举。我想我把WHERE条款搞砸了。。。我不知道

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希望选择懂两种语言的员工(或者,至少我是这样理解这个问题的)。