Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.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 在连接多个表的SQL查询中,我需要连接方面的帮助_Mysql - Fatal编程技术网

Mysql 在连接多个表的SQL查询中,我需要连接方面的帮助

Mysql 在连接多个表的SQL查询中,我需要连接方面的帮助,mysql,Mysql,我有一张报名表: +--------------+-------------+----------------+ | enrolleeId | int(11) | auto_increment | | officeId | int(11) | | | fName | varchar(45) | | | mName | varchar(45) | | |

我有一张报名表:

+--------------+-------------+----------------+
| enrolleeId   | int(11)     | auto_increment |
| officeId     | int(11)     |                |
| fName        | varchar(45) |                |
| mName        | varchar(45) |                |
| lName        | varchar(45) |                |
| dateOfBirth  | date        |                |
| placeOfBirth | int(11)     |                |
| race         | int(11)     |                |
| role         | varchar(45) |                |
+--------------+-------------+----------------+
+----------------+----------+----------------+
| badgeId        | int(11)  | auto_increment |
| enrolleeId     | int(11)  |                |
| expirationDate | datetime |                |
| badgeImage     | blob     |                |
+----------------+----------+----------------+
+-----------+-------------+
| stateId   | int(11)     | 
| code      | varchar(10) | 
| stateName | varchar(45) | 
+-----------+-------------+
+----------+-------------+
| raceId   | int(11)     | 
| code     | varchar(10) | 
| raceName | varchar(45) | 
+----------+-------------+
我有一张有徽章的桌子

+--------------+-------------+----------------+
| enrolleeId   | int(11)     | auto_increment |
| officeId     | int(11)     |                |
| fName        | varchar(45) |                |
| mName        | varchar(45) |                |
| lName        | varchar(45) |                |
| dateOfBirth  | date        |                |
| placeOfBirth | int(11)     |                |
| race         | int(11)     |                |
| role         | varchar(45) |                |
+--------------+-------------+----------------+
+----------------+----------+----------------+
| badgeId        | int(11)  | auto_increment |
| enrolleeId     | int(11)  |                |
| expirationDate | datetime |                |
| badgeImage     | blob     |                |
+----------------+----------+----------------+
+-----------+-------------+
| stateId   | int(11)     | 
| code      | varchar(10) | 
| stateName | varchar(45) | 
+-----------+-------------+
+----------+-------------+
| raceId   | int(11)     | 
| code     | varchar(10) | 
| raceName | varchar(45) | 
+----------+-------------+
我有一张状态表:

+--------------+-------------+----------------+
| enrolleeId   | int(11)     | auto_increment |
| officeId     | int(11)     |                |
| fName        | varchar(45) |                |
| mName        | varchar(45) |                |
| lName        | varchar(45) |                |
| dateOfBirth  | date        |                |
| placeOfBirth | int(11)     |                |
| race         | int(11)     |                |
| role         | varchar(45) |                |
+--------------+-------------+----------------+
+----------------+----------+----------------+
| badgeId        | int(11)  | auto_increment |
| enrolleeId     | int(11)  |                |
| expirationDate | datetime |                |
| badgeImage     | blob     |                |
+----------------+----------+----------------+
+-----------+-------------+
| stateId   | int(11)     | 
| code      | varchar(10) | 
| stateName | varchar(45) | 
+-----------+-------------+
+----------+-------------+
| raceId   | int(11)     | 
| code     | varchar(10) | 
| raceName | varchar(45) | 
+----------+-------------+
我有一张关于种族的表格:

+--------------+-------------+----------------+
| enrolleeId   | int(11)     | auto_increment |
| officeId     | int(11)     |                |
| fName        | varchar(45) |                |
| mName        | varchar(45) |                |
| lName        | varchar(45) |                |
| dateOfBirth  | date        |                |
| placeOfBirth | int(11)     |                |
| race         | int(11)     |                |
| role         | varchar(45) |                |
+--------------+-------------+----------------+
+----------------+----------+----------------+
| badgeId        | int(11)  | auto_increment |
| enrolleeId     | int(11)  |                |
| expirationDate | datetime |                |
| badgeImage     | blob     |                |
+----------------+----------+----------------+
+-----------+-------------+
| stateId   | int(11)     | 
| code      | varchar(10) | 
| stateName | varchar(45) | 
+-----------+-------------+
+----------+-------------+
| raceId   | int(11)     | 
| code     | varchar(10) | 
| raceName | varchar(45) | 
+----------+-------------+
如果我查询注册,则使用以下内容:

SELECT * FROM enrollment e
INNER JOIN state pob on e.placeOfBirth = pob.stateId
INNER JOIN race r on e.race = r.raceId
WHERE e.enrolleeId = 123;
这就是我得到的:

'enrolleeId', 'officeId', 'fName', 'mName', 'lName', 'dateOfBirth', 'placeOfBirth', 'race', 'role', 'stateId', 'code', 'stateName', 'raceId', 'code', 'raceName'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '49', '49', 'Virginia', '2', '2','Caucasian'
'enrolleeId', 'officeId', 'fName', 'mName', 'lName', 'dateOfBirth', 'placeOfBirth', 'race', 'role', 'badgeId', 'enrolleeId', 'expirationDate', 'badgeImage'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '456', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '457', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '458', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '459', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '460', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '461', '123', '2019-01-01 13:00:00', '[blob]'
.
.
.
这是绝对正确的

现在,我要做的是添加到badge表中,这样每个员工查询都会显示他们的badge编号,因此我添加了另一个join:

SELECT * FROM enrollment e
INNER JOIN state pob on e.placeOfBirth = pob.stateId
INNER JOIN race r on e.race = r.raceId
INNER JOIN badge b on e.enrolleeId = b.enrolleeId
WHERE e.enrolleeId = 123;
当我运行此查询时,得到的结果如下:

'enrolleeId', 'officeId', 'fName', 'mName', 'lName', 'dateOfBirth', 'placeOfBirth', 'race', 'role', 'stateId', 'code', 'stateName', 'raceId', 'code', 'raceName'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '49', '49', 'Virginia', '2', '2','Caucasian'
'enrolleeId', 'officeId', 'fName', 'mName', 'lName', 'dateOfBirth', 'placeOfBirth', 'race', 'role', 'badgeId', 'enrolleeId', 'expirationDate', 'badgeImage'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '456', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '457', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '458', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '459', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '460', '123', '2019-01-01 13:00:00', '[blob]'
'123', '1', 'Joe', 'A', 'Smith', '1970-01-01', '49', '2', 'Software Developer', '461', '123', '2019-01-01 13:00:00', '[blob]'
.
.
.
这有点正确。我得到了徽章信息,但我得到了每个员工的所有徽章ID,我没有得到所有的州和种族信息

我怎样才能只得到一名员工的徽章信息

谢谢

更改此行

INNER JOIN badge b on e.enrolleeId = b.enrolleeId
为此:

INNER JOIN (SELECT *, 
                   ROW_NUMBER() OVER (PARTITION BY enrolleeId ORDER BY anyColumnName) rn 
            FROM badge) b
ON e.enrolleeId = b.enrolleeId and b.rn = 1

有点乐观的是,OP将使用MySQL 8.0+@草莓正确。。。我使用的是MySQL版本5.7.21See:请检查
enrolleeId=123
badge
表中是否有单行?@Er_sherlockian
从badge中选择distinct count(*)给我的代码与beachdb.badge中的
选择计数(*)相同。这无关紧要,因为每行的badgeId都是不同的。只需告诉我enrolleeId=123的badge中的
选择计数(*)的结果@Er\u sherlockian好的,就是这样。。。我很笨。我假设创建这个数据库的人不会创建重复的条目,但他们确实创建了。我为这场骚动道歉。