MySQL从子查询中分出group子句

时间:2012-11-21 10:42:02

标签: sql mysqli

这是我的查询

SELECT 
    COALESCE(js.name,'Lead saknas'),
    count(j.id)
FROM 
    jobs j
LEFT JOIN
    job_sources js
    ON j.job_source=js.id
LEFT JOIN 
    (SELECT 
        * 
    FROM 
        quotes 
    GROUP BY 
        job_id) q 
    ON j.id=q.job_id
GROUP BY
    j.job_source

问题在于每个作业允许有多个引号。因为我按照job_id对引号进行分组。现在肯定,这很有效。但我不喜欢子查询的解决方案。如何将子句从子查询分解为主查询?我已经尝试将q.job_id添加到主组子句中,无论是在现有的子句之前还是之后,都没有得到相同的结果。

2 个答案:

答案 0 :(得分:0)

子查询中的GROUP BY将给定job_id的引号中的所有结果限制为1(如果只执行'SELECT *',MySQL将仅为每个不同的分组返回1个结果,即使有多个行具有该分组),所以你将job_sources上的作业连接到一个表上,每个job_id的引号只有一行。

当GROUP BY在主查询中时会发生什么,它将加入3个表,然后为每个job_id选择其中一个。

由于MySQL可以返回多行中的任意一行,显然你不能指望结果在每种情况下都是相同的。

如果你要使用组函数,它应返回相同的结果(尝试类似SELECT COUNT(*),GROUP_CONCAT(quote_id)FROM quotes)。

MS SQL不允许您在执行GROUP BY时执行'SELECT *'(除非您对所有字段进行GROUP BY,这是毫无意义的),因为它可以为不同的查询返回不同的结果。允许在MySQL中执行此操作意味着您应该知道自己在做什么。

更具体地说,MS SQL不允许您选择未分组的字段,除非您对它们使用分组功能。

答案 1 :(得分:0)

我正在寻找一个简单的group by,我想:

SELECT COALESCE(js.name,'Lead saknas'), count(j.id)
FROM jobs j LEFT JOIN
     job_sources js
     ON j.job_source=js.id
GROUP BY COALESCE(js.name,'Lead saknas')