2017-01-10 31 views
0

我有一个相当复杂的查询,它根据子查询对结果进行排序。这工作正常。查询如下。从子查询追加字段

SELECT enrollments.*, users.* 
FROM enrollments 
INNER JOIN users 
ON enrollments.user_id = users.id 
WHERE enrollments.preview = FALSE 
ORDER BY (
    SELECT COUNT(progress_tracker) 
    FROM progress_tracker 
    WHERE progress_tracker.enrollment_id = enrollments.id 
    AND progress_tracker.completed = TRUE 
) 

这里我从用户和注册表中选择字段。理想情况下,我希望在sql结果中有更多的字段。此字段表示ORDER BY sql的结果:

SELECT COUNT(progress_tracker) 
FROM progress_tracker 
WHERE progress_tracker.enrollment_id = enrollments.id 
AND progress_tracker.completed = TRUE 

是否可以从此查询创建一个字段并将其附加到每行的结果中?该行的名称将被适当地称为enrollment_progress_tracker_completed_count。如果是这样,我该怎么做?

回答

2

子查询添加到select,然后用它来排序:

SELECT e.*, u.*, 
     (SELECT COUNT(*) 
     FROM progress_tracker pt 
     WHERE pt.enrollment_id = e.id AND pt.completed = TRUE 
     ) as newcol 
FROM enrollments e INNER JOIN 
    users u 
    ON e.user_id = u.id 
WHERE e.preview = FALSE 
ORDER BY newcol; 
+0

哇,超爽。谢谢! – jason328

2

使用临时表

with tempCounts as(
SELECT enrollment_id, COUNT(progress_tracker) as countValue 
FROM progress_tracker 
WHERE progress_tracker.completed = TRUE 
group by enrollment_id) 

SELECT enrollments.*, users.*,tempCounts.countValue 
FROM enrollments, users.*,tempCounts 
INNER JOIN users 
ON enrollments.user_id = users.id 
WHERE enrollments.preview = FALSE 
and enrollments.id = tempCounts.enrollment_id 
ORDER BY tempCounts.countValue