【问题标题】:mysql subquery only returning one rowmysql子查询只返回一行
【发布时间】:2013-09-13 13:41:04
【问题描述】:

我有一个返回许多行的查询:

SELECT c.id AS courseID,
   c.fullname AS courseName,
   c.continuingeducationcredits AS cec,
   cc.name AS catName,
   IFNULL(ccp.name, '-No Parent Category-') AS catParent,
   ue.userid AS userID,
   CONCAT(u.firstname, ' ', u.lastname) AS name,
   ud.data AS employeeid,
   date_format(date_add('1970-01-01',interval round(c.startdate/60/60/24) DAY), '%m/%d/%Y') AS startdate,
   u.id AS uid,
   c.startdate AS cstartdate
FROM user_enrolments AS ue
INNER
    JOIN USER AS u ON ue.userid = u.id
INNER JOIN user_info_data AS ud ON (ud.fieldid = 1
                                      AND ud.userid = u.id)
INNER JOIN enrol AS e ON e.id = ue.enrolid
INNER JOIN course AS c ON c.id = e.courseid
INNER JOIN course_categories AS cc ON cc.id = c.category
LEFT
    OUTER JOIN course_categories AS ccp ON ccp.id = cc.parent
WHERE 1 = 1
  AND (cc.ID = 13
       OR ccp.ID = 13)
ORDER BY catParent,
         uid,
         cstartdate DESC

效果很好,并返回多行。但如果我尝试将其用作子查询:

SELECT *
FROM
  (SELECT c.id AS courseID,
          c.fullname AS courseName,
          c.continuingeducationcredits AS cec,
          cc.name AS catName,
          IFNULL(ccp.name, '-NO Parent Category-') AS catParent, ue.userid AS userID, CONCAT(u.firstname, ' ', u.lastname) AS name,
          ud.data AS employeeid,
          date_format(date_add('1970-01-01',interval round(c.startdate/60/60/24) DAY), '%m/%d/%Y') AS startdate,
          u.id AS uid,
          c.startdate AS cstartdate
   FROM user_enrolments AS ue
   INNER JOIN USER AS u ON ue.userid = u.id
   INNER JOIN user_info_data AS ud ON (ud.fieldid = 1
                                       AND ud.userid = u.id)
   INNER JOIN enrol AS e ON e.id = ue.enrolid
   INNER JOIN course AS c ON c.id = e.courseid
   INNER
    JOIN course_categories AS cc ON cc.id = c.category
   LEFT OUTER JOIN course_categories AS ccp ON ccp.id = cc.parent
   WHERE 1 = 1
     AND (cc.ID = 13
          OR ccp.ID = 13)) AS Pseudotable
WHERE courseID = 8946
ORDER BY catParent,
         uid,
         cstartdate DESC

它只会返回一行。

我做错了什么? :(

第一个查询是第二个查询的内部查询。

第一个查询获取参加过某个类别中课程的所有用户。第二个旨在过滤该集合,并仅获取参加过单个课程的用户。

【问题讨论】:

  • 能否将查询缩减为核心问题?
  • 有关您编写的代码问题的问题必须在问题本身中描述具体问题——并包含重现问题的有效代码。请参阅SSCCE.org 获取指导。
  • 因为这个:WHERE courseID = 8946 删除它,看看它是否有效

标签: mysql sql


【解决方案1】:

公平地说...我对这个答案的评论是第一:)

WHERE courseID = 8946

在第二个查询中。删除它,它应该可以工作。

【讨论】:

  • 下次直接贴出来作为答案。因为不需要三次发布相同的答案;)
  • @TheEwook 是的,我应该知道得更多。干杯。
  • 我确实需要按课程过滤,但结果中应该有多个用户。第一个查询是第二个查询的内部查询。第一个/内部查询列出了参加所选类别课程的所有用户。第二个外部查询将其缩小到课程。问题是最终的外部查询结果中只有一个用户。
  • @GregHolmes 当内部/第一个查询执行时......你确定实际上有超过 1 个课程是 8946 吗?因为如果真的有那么这似乎是不可能的。
  • 是的,我确定。一共有三个。
【解决方案2】:

由于WHERE 条件,您的第二个查询中有一行,而您在第一个查询中没有。

WHERE courseID = 8946

【讨论】:

    【解决方案3】:

    您有 WHERE courseID = 8946,您将查询减少到一个 ID

    【讨论】:

      【解决方案4】:

      我终于找到了问题所在……应用程序是 Moodle,它使用名为 get_records_sql 的函数将查询加载到数组中。

      要求结果的第一行是唯一键。它使用该行作为数组的索引。

      所以...要做到这一点:

      像这样开始 SELECT-

      SELECT @a:=@a+1 as serial_number, c.id as courseID,
      

      并将其添加到 FROM 子句中-

      LEFT OUTER JOIN mdl_course_categories AS ccp ON ccp.id = cc.parent, (SELECT @a:= 0) AS a WHERE
      

      【讨论】:

        猜你喜欢
        • 2012-08-04
        • 2020-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多