在同一个表上执行多个联接

时间:2015-12-03 09:12:18

标签: mysql performance join

鉴于以下表格:

操作

 - id - UNSIGNED INT - PRIMARY KEY
 - name - VARCHAR(50)
 - user1_id - UNSIGNED INT - INDEX
 - user2_id - UNSIGNED INT - INDEX
 - user3_id - UNSIGNED INT - INDEX

(我为这个例子做了这个简短但实际上有9个用户)

用户

 - id - UNSIGNED INT - PRIMARY KEY
 - name - VARCHAR(50)

我想显示一个具有每个用户名称的操作列表(注意:操作并不总是定义所有用户)

我能想出的唯一解决方案是为每个用户提供一个左连接的可怕查询:

SELECT name, user1.name AS name1, user2.name AS name2, user3.name AS name3
FROM actions
LEFT JOIN users AS user1 ON user1.id = actions.user1_id
LEFT JOIN users AS user2 ON user2.id = actions.user2_id
LEFT JOIN users AS user3 ON user3.id = actions.user3_id

实际查询为9个用户提供了9个左连接(+ 2个内连接以恢复其他一些关于操作的内容)

这很有效,但必须有一个更高效的解决方案。这个有多糟糕?相同表上的9个连接和9个类似表上的9个连接之间是否存在差异(在性能方面)?

1 个答案:

答案 0 :(得分:0)

我很确定如果翻转一下,这会得到类似的结果集:

SELECT a.name, u.name
FROM actions a
CROSS JOIN users u