是否有一个复杂的选择查询来解决这个问题

Posted

技术标签:

【中文标题】是否有一个复杂的选择查询来解决这个问题【英文标题】:Is there a complicated select query to solve this problem 【发布时间】:2019-08-22 18:22:07 【问题描述】:

我需要对一个表进行查询,在这个查询中我想在 corsspde 用户“first_name”的值中替换“created_by”的值 因为一个用户创建了另一个用户,所以我想返回创建者的真实姓名而不是他的 id

我试图深入了解查询类型,但查询类型太多了,内连接、外连接、左连接、变量...... 我不知道哪个概念是解决方案[在此处输入图片描述]

【问题讨论】:

【参考方案1】:

您将从该表执行 INNER JOIN 回到自身:

 SELECT users.*, createdby.*
 FROM yourtable users
     INNER JOIN yourtable createdby
        ON users.created_by = createdby.id

为了做到这一点,FROM 子句中的每个表都获得了一个别名。我们第一次使用它时,我称它为users,第二次我称它为createdby。这使得在 SQL 的其余部分中很明显正在引用哪个表以及为什么。

我们将第一个表的created_by 连接到第二个表的id。本质上,第二个表包含created_by 用户的属性。

您只需将yourtable 替换为您的实际表名,并可能将这些* 替换为您想要从每个表中获取的实际字段。

【讨论】:

哦,谢谢,但我需要完成它:我的 uset 表有列“create_by”,我想用另一个值返回这个列,而不是返回创建用户的 id当前用户,我想返回其他值,例如“first_name”,你能帮我解决一下这样的查询吗或作为新变量 我试过 thsis ,但它不起作用 SELECT user.id , user.first_name, REPLACE(create_by,(select u.first_name from users as u where user.create_by=u. id)) AS create_by FROM users as user 恐怕我不明白你想要什么。请根据您粘贴为图像的示例数据重写您的问题并提供所需的结果。【参考方案2】:

这应该由客户端代码而不是查询来处理,因为它会导致混淆。如果你真的想要它,你可以只取 first_name 列值并将其作为 create_by 返回,如下所示:

SELECT first_name AS create_by FROM user;

【讨论】:

以上是关于是否有一个复杂的选择查询来解决这个问题的主要内容,如果未能解决你的问题,请参考以下文章

关于查询报表总是"超时已过期"的问题解决

子选择或连接?有没有更好的方法来编写这个 mysql 查询?

您如何优化这个复杂的 sql 查询,然后选择正确的表索引

Crystal Reports仅选择唯一ID

通过使用字符串来查询这个选择器[关闭]

算法是否只和数学有关?