【问题标题】:Select all fields when working with multiple innerjoins使用多个内部联接时选择所有字段
【发布时间】:2019-01-20 02:59:25
【问题描述】:

我有一张像这样的表

participant_coach 表

id----nutrition_coach----mental_coach----movement_coach
1 ----       2       ----      5     ----      4

教练桌

id----name----email----
2 ----NAME---- @@@@ ----

通过Inner Join,我想获取每位教练的完整数据。

这是我的当前查询

SELECT
    c1 AS nutrition_coach,
    c2 AS movement_coach,
    c3 AS mental_coach
FROM participant_coaches AS pc 
INNER JOIN coaches AS c1 ON pc.nutrition_coach = c1.id 
INNER JOIN coaches AS c2 ON pc.movement_coach = c2.id 
INNER JOIN coaches AS c3 ON pc.mental_coach = c3.id 
WHERE participant = + participantId

这不起作用,它给出了一个错误,它不知道字段c1。但是,当我只想从我的 c1 表中选择 1 个属性时,它确实有效。

例如,这是可行的

SELECT c1.id AS nutrition_coach, 
       c2.id AS movement_coach, 
       c3.id AS mental_coach

返回:

mental_coach: 3
movement_coach: 1
nutrition_coach: 2

我是否可以从c1中选择所有字段而不是只选择1个?

这是我想要实现的目标

回复:

    {
       mental_coach: {
          id: 1
          name: 'MYNAME'
          email '@@@@'
       }
       movement_coach: {
          ...
       }
       nutrition_coach: {
          ...
       }
   }

【问题讨论】:

  • 要从 c1 中选择所有字段,您应该使用 c1.* 而不是只使用 c1 但是要获得上述响应,您必须为每列指定单独的别名
  • 如果您需要 JSON 输出,请考虑使用 MySQL 的 JSON API,或者您可能必须在 Node.js 代码中生成此内容。

标签: mysql sql json node.js


【解决方案1】:

身份证姓名电子邮件

您的查询很好,除了select。 MySQL 没有代表表中整行的“记录”的概念。您需要明确列出列:

SELECT c1.id AS nutrition_coach_id,
       c1.name AS nutrition_coach_name,
       c1.email AS nutrition_coach_email,       
       c2.id AS movement_coach_id,
       c2.name AS movement_coach_name,
       c2.email AS movement_coach_email,
       c3.id AS mental_coach_id,
       c3.name AS mental_coach_name,
       c3.email AS mental_coach_email

【讨论】:

    【解决方案2】:

    您的 select 语句仅引用代表 的别名,但实际上并未说明您要使用哪一列。大概您想报告三种不同类型教练的名称,其中应该起作用:

    SELECT
        c1.name AS nutrition_coach,
        c1.email AS nutrition_coach_email, -- etc. for other fields
        c2.name AS movement_coach,
        c3.name AS mental_coach
    FROM participant_coaches AS pc 
    INNER JOIN coaches AS c1
        ON pc.nutrition_coach = c1.id 
    INNER JOIN coaches AS c2
        ON pc.movement_coach = c2.id 
    INNER JOIN coaches AS c3
        ON pc.mental_coach = c3.id 
    WHERE participant = <participantId>
    

    【讨论】:

    • 是的,我知道这是我的问题。但是假设我有很多字段并且我想全部选择它们,有什么办法可以做到这一点,还是我必须手动输入每个字段名?理想情况下,我可以做到 c1.* AS nutrition_coach 但这不起作用
    • 是的,c1.* 会选择营养教练的所有教练字段,但是,你不能真正给它一个列别名,因为它通常是多个列.一般来说,使用SELECT * 是不好的,应该避免使用。
    • 所以如果我理解正确,我想要的响应(如 OP 中所示)不可能通过 SQL 查询?
    • @Nicolas 是的,请参阅 Gordon 的回答,他显然比我更彻底地阅读了您的问题。只需从教练表中选择您想要的任何列,idnameemail
    猜你喜欢
    • 2023-02-16
    • 1970-01-01
    • 2014-11-21
    • 2014-01-21
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2011-07-10
    • 2016-04-08
    相关资源
    最近更新 更多