【问题标题】:MySQL - conditional select in groupMySQL - 组中的条件选择
【发布时间】:2017-04-09 18:24:23
【问题描述】:

我有一个包含几行的简单表格,我想按id_room 对它们进行分组,并仅在条件为真时选择值。问题是即使有一行具有正确的日期列year_month,条件总是错误的。

这是架构:

CREATE TABLE tbl_account_room (
  `id` int, 
  `year_month` date, 
  `value` int,
  `id_room` int
);

INSERT INTO tbl_account_room
    (`id`, `year_month`, `value`, `id_room`)
VALUES
    (1, '2016-08-01', 1, 300),
    (2, '2016-09-01', 2, 300),
    (3, '2016-10-01', 3, 300);

这里查询:

SELECT 
  (case when '2016-10-01' = ar.year_month then ar.value else 0 end) as total
FROM tbl_account_room AS ar
WHERE ar.year_month >= "2016-08-01"
  AND ar.year_month <= "2016-11-01"
  and ar.id_room = '300'
GROUP BY ar.id_room
LIMIT 10

这里是SQL Fiddle

total 列中,我得到 0,我想得到值 3,因为 year_month2016-10-01。为什么会这样?

【问题讨论】:

    标签: mysql sql select group-by conditional-statements


    【解决方案1】:

    不知道为什么你想要这样的结果,在这里你可以使用 self join 来做到这一点:

    SELECT 
      MAX(t1.value) as total,
      GROUP_CONCAT(ar.year_month)
    FROM tbl_account_room AS ar
    LEFT JOIN tbl_account_room AS t1
    ON ar.id_room = t1.id_room
    AND ar.year_month = t1.year_month
    AND t1.year_month = '2016-10-01'
    WHERE ar.year_month >= "2016-08-01"
      AND ar.year_month <= "2016-11-01"
      and ar.id_room = '300'
    GROUP BY ar.id_room
    LIMIT 10;
    

    这里是SQLFiddle Demo

    【讨论】:

      【解决方案2】:

      您当然不需要 CASE 条件并将该条件包含在您的 WHERE 子句中,而不是像

      SELECT 
      ar.value as total,
      GROUP_CONCAT(ar.year_month)
      FROM tbl_account_room AS ar
      WHERE ar.year_month = '2016-10-01'
      GROUP BY ar.id_room;
      

      【讨论】:

        猜你喜欢
        • 2012-03-06
        • 2011-10-09
        • 1970-01-01
        • 1970-01-01
        • 2013-04-20
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 2011-08-10
        相关资源
        最近更新 更多