2013-09-13 4 views
0

У меня есть запрос, который возвращает количество строк:MySQL подзапрос возвращает только одну строку

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 

Он будет возвращать только один ряд.

Что я делаю неправильно? :(

Первый запрос является внутренним запросом второго запроса.

Первым запрос получает все пользователь, которые посещали курс в пределах категории. Второй предназначен для фильтрации этого набора, и получить только пользователи, которые посетили один курс.

+0

Вы можете уменьшить запрос на основная проблема? –

+0

Вопросы, касающиеся проблем с кодом, который вы написали, должны описывать ** конкретную проблему ** - и включать действительный код для ее воспроизведения - в самом вопросе. См. [SSCCE.org] (http://sscce.org/) для руководства. – Kermit

+0

Это из-за этого: 'WHERE courseID = 8946' удалить это и посмотреть, если он работает –

ответ

0

Я наконец выяснил проблему ... приложение Moodle, и оно загружает запросы в массив, используя функцию get_records_sql.

первая строка результатов, чтобы быть уникальным ключом. Он использует эту строку как индекс массива.

Так ... чтобы это произошло:

Начните ВЫБРАТЬ как this-

SELECT @a:[email protected]+1 as serial_number, c.id as courseID, 

И добавить к этому ОТ clause-

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

у вас есть одна строка в вашем втором запросе из-за WHERE состояние, которое вы не получили в первом запросе.

WHERE courseID = 8946 
0

вы есть WHERE courseID = 8946, которые вы reduci нг запроса к одному ID

1

Чтобы быть справедливыми ... мой комментарий с этим ответом был первым :)

WHERE courseID = 8946 

во втором запросе. Удалите его, и он должен работать.

+0

В следующий раз отправьте его как ответ напрямую. Потому что нет необходимости отправлять один и тот же ответ три раза;) – TheEwook

+0

@ TheEwook Да, я должен знать лучше. Приветствия. –

+0

Мне нужно фильтровать по курсу, но в результатах должно быть несколько пользователей. Первый запрос - это внутренний запрос второго запроса. В первом/внутреннем запросе перечислены все пользователи, посетившие курс в выбранной категории. Второй внешний запрос сужает это до курса. Проблема заключается в том, что в конечном, внешнем запросе результата есть только один пользователь. –

Смежные вопросы