【问题标题】:mysql select query issuemysql选择查询问题
【发布时间】:2011-08-07 00:10:15
【问题描述】:

我们有一个这样的数据库:

CREATE TABLE `jobs` (
  `id` int NOT NULL AUTO_INCREMENT,
  `job` varchar(255),
  PRIMARY KEY (`id`)
);

INSERT INTO `jobs` VALUES
(1,'a'),
(2,'b'),
(3,'c'),
(4,'d');

CREATE TABLE `payments` (
  `job_id` int,
  `amount` int 
);

INSERT INTO `payments` VALUES
(1,100),
(1,100),
(2,600),
(2,600);

我们的任务是:

获取所有支付金额小于 1000 的工作。

因此,我们应该作业 'a'、'c' 和 'd'。但我们的查询:

SELECT job 
FROM jobs j
JOIN payments p ON j.id=p.job_id
GROUP BY job_id
HAVING sum(amount) < 1000;

不包括没有任何报酬的工作。所以结果我们只得到'a'。

我们应该如何构造查询以获取付款总和小于 1000 的所有工作?

【问题讨论】:

    标签: mysql sql group-by sum


    【解决方案1】:

    我想你可能需要LEFT JOIN

    SELECT job 
    FROM jobs j LEFT JOIN payments p ON j.id=p.job_id
    GROUP BY job_id 
    HAVING sum(amount) < 1000;
    

    【讨论】:

    • 左连接在这种情况下没有帮助。
    【解决方案2】:

    只要您使用 case 语句来确保左连接将起作用 对于没有付款的工作,该金额计算为零。否则,amount 将为空,因此无法与 HAVING 子句中的 1000 进行比较。

    SELECT j.id job_id ,sum(case when amount is null then 0 else amount end)
    FROM jobs j LEFT JOIN payments p ON j.id=p.job_id
    GROUP BY j.id
    HAVING sum(case when amount is null then 0 else amount end) < 1000;
    

    注意这适用于 oracle,不确定 mysql 上的确切语法。

    【讨论】:

      【解决方案3】:

      需要将job加入求和查询的结果:

      SELECT * 
      from job j
      join (SELECT job_id, sum(amount) 
          FROM jobs j
          JOIN payments p ON j.id=p.job_id
          GROUP BY job_id
          HAVING sum(amount) < 1000) x on x.job_id = j.job_id
      union
      SELECT * from job where job_id not in (select job_id from payments);
      

      工会还找到了没有报酬的工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-27
        • 2012-05-08
        • 2014-02-18
        • 1970-01-01
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多