鉴于以下表格:
操作
- 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个连接之间是否存在差异(在性能方面)?
答案 0 :(得分:0)
我很确定如果翻转一下,这会得到类似的结果集:
SELECT a.name, u.name
FROM actions a
CROSS JOIN users u