mySQL查询有点麻烦

时间:2016-04-21 11:32:00

标签: mysql database

说我有一个名为“users”的表,它包含系统的所有用户。除了“role”和“roles”列之外,每个用户都有“name”列定义的“id”。具有“worker”角色的每个用户都会被“supervisor”列定义的“advised_by”建议。

我想查询我的数据库,以便它返回工作人员及其主管和一行的名称,是否可以不加入?

感谢您的任何建议,我现在一直在反对这个问题

编辑:感谢所有试图提供帮助的人。对不起,我想回想起来这是一个非常模糊/可怕的描述。我会尝试在这里更好地模拟表格。

列:名称,ID,角色,Advised_by

第1行:Bob,123,Worker,321

第2行:Tom,321,主管,N / A

我想将所有标记为“Workers”的人员及其姓名和主管姓名一起返回结果,如下所示:Bob,Worker,Tom在一条线上。 我试图避免添加连接,因为我的教授要求我们不要使用它们,因为性能受到了影响,但似乎并没有一种实用的方法,在这种情况下,我会很好地加入。< / p>

编辑2:猜猜我只是个白痴,我意识到我把它全部输出后我可以很容易地使用别名来做。对不起麻烦的家伙

3 个答案:

答案 0 :(得分:0)

有必要提供更多细节,但您需要加入表格,以便在一个MySQL句子中同时获得主管和工作人员的姓名。

假设advisory_by列包含建议此worker的用户的ID:

SELECT u.id, u.name, u2.id AS supervisorID, u2.name AS supervisorNAME 
FROM users u, users u2 
WHERE u.advised_by = u2.id AND u.role = 'worker'

答案 1 :(得分:0)

有可能重复EpochGalaxy提供的答案......

问:没有连接,这可能吗?

答:是的。有可能的。一种方法是使用相关子查询。

考虑运行以获取主管名称的查询...

 SELECT s.name
   FROM users s
  WHERE s.id = 321

如果您为从用户检索到的每个行运行了类似的查询,该怎么办?

假设你运行了这样的查询:

SELECT u.id
     , u.name
     , u.role
     , u.advised_by
  FROM users u
 ORDER BY u.id

对于该查询中的每一行,在您返回之前,您运行了一个查询以获取主管的名称。

我们可以通过在SELECT列表中使用子查询来实现这一点。

作为在SELECT列表中运行子查询的一个简单示例,请考虑此查询。 (我们没有合理的理由来运行这样的查询,但作为一个简单的演示,我们可以运行子查询...

SELECT u.id
     , u.name
     , u.role
     , u.advised_by
     , ( SELECT 'bar' ) AS foo
  FROM users u
 ORDER BY u.id

此查询返回的行将包含一个名为foo的附加列。分配给列的值将从子查询的结果中提供...&#34; SELECT&#39; bar&#39;&#34;。

现在我们知道我们可以在SELECT列表中运行子查询,并返回一个列,我们可以尝试别的。像这样:

SELECT u.id
     , u.name
     , u.role
     , u.advised_by
     , ( SELECT s.name
           FROM users s
          WHERE s.id = 321
       ) AS s_name
  FROM users u
 ORDER BY u.id

这样,对于外部查询返回的每一行,MySQL将在SELECT列表中运行子查询,并获取子查询返回的值,并将返回的值放入由外部返回的行的列中查询。

该子查询将仅获取id = 321的用户行中的名称。

所以这并不能真正满足我们的需要。

这里的诀窍...而不是字面值321,我们可以在那里放置一个表达式,其中包含对外部查询中表的引用。

SELECT u.id
     , u.name
     , u.role
     , u.advised_by
     , ( SELECT s.name
           FROM users s
          WHERE s.id = u.advised_by
       ) AS s_name
  FROM users u
 ORDER BY u.id

啊哈!

现在,对于外部查询返回的每一行,MySQL将在SELECT中运行子查询。

这次,子查询包含对外部查询行中的advisory_by列的引用。 MySQL将从返回的行(通过外部查询)获取在advice_by列中的值,然后在子查询执行之前将其滑入子查询中。子查询的返回进入结果集的列。

有了这个,我们从sbuquery获得的结果由外部查询中的值决定。子查询与外部查询相关

对注释的一些重要限制:另一个查询的SELECT列表中的子查询必须完全返回一个列。 (它可以是一个表达式,一个文字。但子查询的返回不允许返回两列或更多列。

子查询必须返回不超过一行。如果它返回零行,则为外部查询中的列分配NULL值。

上例中的子查询满足条件。 SELECT列表中只有一个表达式,而用户表中的id列是 unique ,因此它不能返回多行。

使用像这样的子查询的SQL术语是相关子查询

所以,回答你的问题,是的......没有连接操作就可以实现指定的结果。

其他一些说明:

在性能方面,子查询是有效的,这一点非常重要。它将由外部查询返回的每个行执行。如果我们返回10,000行,那么该子查询的执行次数为10,000次。

因此,这种方法最适合外部查询返回少量行的情况,并且相关子查询非常有效。

答案 2 :(得分:-1)

使用以下查询:

SELECT (u.name)workername, (select name from users where id=u.advised_by)supervisor FROM `users` u where u.roles="worker" 

您所描述的示例表结构:

--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Table structure for table `users`
--

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `roles` varchar(255) NOT NULL,
  `advised_by` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `name`, `roles`, `advised_by`) VALUES
(1, 'test1', 'supervisor', 0),
(2, 'test2', 'worker', 1),
(3, 'test3', 'worker', 1);