【问题标题】:Unknown column 'parent.username' in 'field list' doing LEFT JOIN on 2 tables“字段列表”中的未知列“parent.username”在 2 个表上执行 LEFT JOIN
【发布时间】:2014-03-02 00:24:07
【问题描述】:

我正在构建一个嵌套的 cmets 功能。我有submissions_comments,看起来像:

+---------------+------------------+------+-----+---------+----------------+
| Field         | Type             | Null | Key | Default | Extra          |
+---------------+------------------+------+-----+---------+----------------+
| id            | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id       | int(10) unsigned | NO   | MUL | NULL    |                |
| submission_id | int(11)          | NO   | MUL | NULL    |                |
| comment       | text             | NO   |     | NULL    |                |
| parent_id     | int(10) unsigned | YES  | MUL | NULL    |                |
| created       | datetime         | NO   | MUL | NULL    |                |
| created_ip    | int(11)          | NO   |     | NULL    |                |
| helpful_count | int(11)          | NO   | MUL | NULL    |                |
| deleted       | tinyint(4)       | NO   | MUL | 0       |                |
+---------------+------------------+------+-----+---------+----------------+'

和看起来像这样的用户:

  +----------------+------------------------+------+-----+-------------------+-----------------------------+
| Field          | Type                   | Null | Key | Default           | Extra                       |
+----------------+------------------------+------+-----+-------------------+-----------------------------+
| id             | int(10) unsigned       | NO   | PRI | NULL              | auto_increment              |
| email          | varchar(128)           | NO   | MUL | NULL              |                             |
| username       | varchar(23)            | NO   |     | NULL              |                             |
| name           | varchar(32)            | NO   |     | NULL              |                             |
| about          | varchar(255)           | NO   |     | NULL              |                             |
+----------------+------------------------+------+-----+-------------------+-----------------------------+

我正在使用 GROUP_CONCATLEFT JOIN 为我提供所有子 cmets(在我的 submissions_comments 表中),并使用此查询:

SELECT parent.id, MAX(parent.comment) as pcomm,
       GROUP_CONCAT(child.id ORDER BY child.id) as children,
       GROUP_CONCAT(child.comment ORDER BY child.id) as childrenComments
FROM   submissions_comments AS parent
 LEFT  JOIN submissions_comments AS child
   ON  child.parent_id = parent.id
WHERE  parent.parent_id IS NULL
GROUP  BY parent.id
ORDER  BY parent.id;

这给了我:

+----+-------------------------------+----------+--------------------------------------------------------+
| id | pcomm                         | siblings | siblingComments                                        |
+----+-------------------------------+----------+--------------------------------------------------------+
|  1 | This is a parent              | 2,4      | This is a child comment,This is a second child comment |
|  3 | I don't have any children | NULL     | NULL                                                   |
|  5 | Testing one two three         | NULL     | NULL                                                   |
|  6 | adsdfsasdf                    | NULL     | NULL                                                   |
|  7 | asdfadsfdsaf                  | NULL     | NULL                                                   |
|  8 | asdfasdsadfsadf               | NULL     | NULL                                                   |
|  9 | asdfsdafsdafdaafds            | NULL     | NULL                                                   |
+----+-------------------------------+----------+--------------------------------------------------------+

我的问题:我正在尝试在submissions_comments 上加入users u,这样我就可以获得usernameemailnameabout 对于每个家长评论和子 cmets。

我的查询:

SELECT parent.id, MAX(parent.comment) as pcomm,
       parent.username, 
       GROUP_CONCAT(child.id ORDER BY child.id) as children,
       GROUP_CONCAT(child.comment ORDER BY child.id) as childrenComments,
       GROUP_CONCAT(child.username ORDER BY child.id) as childrenUsernames
FROM   submissions_comments AS parent
 LEFT  JOIN submissions_comments AS child
   ON  child.parent_id = parent.id
LEFT JOIN users u on parent.user_id = u.id
GROUP  BY parent.id
ORDER  BY parent.id;

我想要什么:

+----+-------------------------------+----------+--------------------------------------------------------+-----------------------+
| id | pcomm                         | children | childrenComments                                       |childrenUsernames      |
+----+-------------------------------+----------+--------------------------------------------------------+-----------------------+
|  1 | This is a parent              | 2,4      | This is a child comment,This is a second child comment |blahbster, user123     |
|  3 | I don't have any children | NULL     | NULL                                                   |                       |
|  5 | Testing one two three         | NULL     | NULL                                                   |                       |
|  6 | adsdfsasdf                    | NULL     | NULL                                                   |                       |
|  7 | asdfadsfdsaf                  | NULL     | NULL                                                   |                       |
|  8 | asdfasdsadfsadf               | NULL     | NULL                                                   |                       |
|  9 | asdfsdafsdafdaafds            | NULL     | NULL                                                   |                       |
+----+-------------------------------+----------+--------------------------------------------------------+-----------------------+

我不断收到以下错误:错误 1054 (42S22):“字段列表”中的未知列“parent.username”和错误 1054 (42S22):“字段列表”中的未知列“child.username”。

【问题讨论】:

    标签: mysql sql join left-join


    【解决方案1】:

    如果您需要parentchild 的用户名,您将不得不去获取它们;它们不在 submits_cmets 表中,而是链接到该表。

    SELECT parent.id, MAX(parent.comment) as pcomm,
           pu.username, 
    
           /* display child comments in order of child USER id */
           GROUP_CONCAT(cu.id ORDER BY cu.id) as children,
           GROUP_CONCAT(child.comment ORDER BY cu.id) as childrenComments,
           GROUP_CONCAT(cu.username ORDER BY cu.id) as childrenUsernames
    
      /* handle parent submissions, with user identity */
      FROM submissions_comments AS parent
      LEFT JOIN users AS pu ON parent.user_id = u.id   /* get parents' user info */
    
      /* handle child submissions, with user identity */
      LEFT JOIN submissions_comments AS child  ON  child.parent_id = parent.id
      LEFT JOIN users AS cu ON child.user_id = cu.id   /* get children's user info */
    
    GROUP  BY parent.id, pu.username   /* avoid stupid nonstandard MySQL GROUP BY */
    ORDER  BY parent.id, pu.username
    

    如您所见,您可以对查询进行一些调整以获得您需要的内容。

    【讨论】:

      【解决方案2】:

      parentsubmissions_comments 的别名,它没有username 这样的列。
      只有users 表有一个名为username 的列。

      变化:

      select ...
      parent.username,
      ...
      

      收件人:

      select ...
      u.username,
      ...
      

      您的 group by 子句中还有一个错误:您必须将 username 添加到它以获得正确的行为:

      GROUP BY parent.id, u.username
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 2018-10-03
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-20
        相关资源
        最近更新 更多