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好的,就是这样。。。我很笨。我假设创建这个数据库的人不会创建重复的条目,但他们确实创建了。我为这场骚动道歉。