2011-03-01 20 views
0
SELECT a.*, 
     b.*, 
     b.id AS user_id, 
     a.id AS group_id 
FROM groups a, 
    users b 
WHERE a.group_leader_id = b.id 

谢谢。请用英文解释这条SQL语句!

+1

弗林特 - 我已经重新格式化代码在你的问题。这将有助于您更好地了解其结构。 – eumiro 2011-03-01 09:50:06

+0

啊,它在重新格式化时变得更清晰了! – Owen 2011-03-01 11:50:18

回答

1

显示谁是一群

 
SELECT a.*, b.*, 
b.id AS user_id, -- use an alias for users.id 
a.id AS group_id -- use an alias for groups.id 
FROM groups a, -- alias table groups as 'a' 
    users b -- alias table users as 'b' 
WHERE a.group_leader_id = b.id -- show only those users who are a leader of a group, and link them to that group 
 

据我,你的查询可以进行优化,以这种的领导者所有群体,只有那些用户:

SELECT a.*, b.*, b.id AS user_id, a.id AS group_id 
FROM groups a 
    INNER JOIN users b ON a.group_leader_id = b.id 
+0

当你说'优化'时,你的意思是显式连接比隐式连接快吗? – Owen 2011-03-01 11:52:47

+0

这取决于。如果您使用的是SQL Server,则答案为“是”。原因在于“ON”子句在“WHERE”块之前执行。对于最佳实践使用,我强烈建议使用显式连接“WHERE”子句。 – 2011-03-01 12:52:20

+0

查看为两个查询创建的执行计划。您可能会发现优化程序已将“WHERE”连接重写为INNER JOIN语法。但是,两种替代方法都是完全有效的ANSI语法。但我也会说,最好使用明确的JOIN样式。 – 2011-03-01 13:31:12

0

这意味着从2个表格中挑选出组长(没有说明详细信息),其中B列出了组长,A组有用户的详细信息。

1
SELECT a.*, b.*, b.id //select all columns from a, b and id from table b with alias user_id 
AS user_id, a.id  // id from table a with alias group_id 
AS group_id 
FROM groups a, users b //from tables groups and users with aliases a and b 
WHERE a.group_leader_id = b.id //where group_leader_id from groups = id from users. 
1

该声明是两个表组和用户组之间的连接组的外键。

所以我会这样说: 显示组长的用户信息(包含user_id和group_id的冗余重命名)。

1

列出所有组和他们的领导。

SELECT 
    a.*, 
    b.*, 
    b.id AS user_id, 
    a.id AS group_id 
FROM 
    groups a 
INNER JOIN 
    users b 
ON 
    a.group_leader_id = b.id 
+1

你为什么把它转换成一个'OUTER'加入? Q中的声明是内部JOIN。 – 2011-03-01 12:10:49

+0

@Martin你说得对,我犯了一个错误。我纠正了我的答案。 – Branimir 2011-03-01 12:28:38

0

给我从组中的所有列+的所有列从用户+重命名b.id为USER_ID +重命名a.id从组中的所有行GROUP_ID那里是从团体到用户的匹配。