首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL5.6:寻求group_concat帮助

MySQL5.6:寻求group_concat帮助
EN

Stack Overflow用户
提问于 2016-01-24 05:10:33
回答 1查看 217关注 0票数 0

我有桌子:

代码语言:javascript
复制
    CREATE TABLE IF NOT EXISTS `buildingAccess` (
    `id` int(10) unsigned NOT NULL,
      `building` varchar(16) NOT NULL,
      `person` varchar(16) NOT NULL,
      `enteryDate` datetime NOT NULL,
      `exitDate` datetime DEFAULT NULL
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

    INSERT INTO `buildingAccess` (`id`, `building`, `person`, `enteryDate`, `exitDate`) VALUES
    (1, 'Lot B-3', 'Alice Jones', '2015-11-10 05:29:14', '2015-11-10 15:18:42'),
    (3, 'Lot B-3', 'Alice Jones', '2015-11-11 07:11:27', '2015-11-11 12:43:34'),
    (7, 'Lot B-3', 'Alice Jones', '2015-12-10 07:11:27', '2015-12-11 12:43:34'),
    (2, 'Lot B-3', 'Bill Mayhew', '2015-11-10 10:29:14', '2015-11-10 12:18:42'),
    (4, 'Lot B-3', 'Bill Mayhew', '2015-11-12 09:10:27', '2015-11-13 02:43:34'),
    (8, 'Lot B-3', 'Bill Mayhew', '2015-11-12 09:10:27', '2015-11-13 02:43:34'),
    (5, 'Lot B-3', 'Charlotte Ahn', '2015-12-01 05:29:14', NULL),
    (6, 'Lot B-3', 'Dennis Lowe', '2015-12-10 10:29:14', '2015-12-10 12:18:42');

    CREATE TABLE IF NOT EXISTS `buildingNotes` (
      `building` varchar(16) NOT NULL,
      `observer` varchar(16) NOT NULL,
      `observationDate` datetime NOT NULL,
      `note` varchar(64) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO `buildingNotes` (`building`, `observer`, `observationDate`, `note`) VALUES
    ('Lot B-3', 'Alice Jones', '2015-11-10 05:32:12', 'burned out light on pole South-22'),
    ('Lot B-3', 'Alice Jones', '2015-11-10 05:39:12', 'burned out light on pole West-7'),
    ('Lot B-3', 'Alice Jones', '2015-11-10 05:42:12', 'overfull trash can near pole North-11'),
    ('Lot B-3', 'Charlotte Ahn', '2015-12-01 06:09:14', 'change drawr running low at gate 3');

    ALTER TABLE `buildingAccess`
     ADD PRIMARY KEY (`id`), ADD KEY `building` (`building`,`person`,`enteryDate`,`exitDate`);

    ALTER TABLE `buildingNotes`
     ADD KEY `building` (`building`,`observer`,`observationDate`,`note`);

    ALTER TABLE `buildingAccess`
    MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=9;

我的目标是一个查询,返回buildingAccess表中所有记录的列表。每个字段都应该有一个notes字段,该字段是在该记录的日期/时间由buildingAccess.enteryDatebuildingAccess.exitDate括起来的所有buildingNotes.note条目的GROUP_CONCAT

我试过几件事,但坚持住了:

代码语言:javascript
复制
    select 
        BA.building,
        BA.person,
        BA.enteryDate,
        IFNULL(BA.exitDate, NOW()),
        IFNULL(
            GROUP_CONCAT(
                '<p>',
                BN.observationDate, ': ',
                BN.observer, ': ', BN.note,
                '</p>'
                ORDER BY BN.observationDate ASC
                SEPARATOR ''
            ), 
            ''
        )
    from
        buildingAccess BA
        LEFT JOIN buildingNotes BN ON 
            BN.building = BA.building
            AND BN.observationDate BETWEEN BA.enteryDate AND BA.exitDate
    group by BN.building

这将返回:

代码语言:javascript
复制
+----------+---------------+---------------------+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| building | person        | enteryDate          | exitDate            | observations                                                                                                                                                                                                                     |
+----------+---------------+---------------------+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Lot B-3  | Charlotte Ahn | 2015-12-01 05:29:14 | 2016-01-23 23:04:04 |                                                                                                                                                                                                                                  |
| Lot B-3  | Alice Jones   | 2015-11-10 05:29:14 | 2015-11-10 15:18:42 | <p>2015-11-10 05:32:12: Alice Jones: burned out light on pole South-22</p><p>2015-11-10 05:39:12: Alice Jones: burned out light on pole West-7</p><p>2015-11-10 05:42:12: Alice Jones: overfull trash can near pole North-11</p> |
+----------+---------------+---------------------+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

我希望看到所有其他的buildingAccess记录,即使没有buildingNotes记录。

我假设我没有按正确的事物“分组”,但我还没有找到正确的组合。

指针?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-24 05:42:27

我认为应该使用BN.building,它来自GROUP BY子句中的外部联接表。尝试以下几点:

代码语言:javascript
复制
SELECT
      BA.building
    , BA.person
    , BA.enteryDate
    , IFNULL(BA.exitDate, NOW())
    , IFNULL (
              GROUP_CONCAT (
                            '<p>',
                            BN.observationDate, ': ',
                            BN.observer, ': ', BN.note,
                            '</p>'
                            ORDER BY BN.observationDate ASC
                            SEPARATOR ''
                            )
                ,''
              )
FROM buildingAccess BA
      LEFT JOIN buildingNotes BN ON BN.building = BA.building
                  AND BN.observationDate BETWEEN BA.enteryDate AND BA.exitDate
GROUP BY
      BA.building
    , BA.person
    , BA.enteryDate
    , IFNULL(BA.exitDate, NOW())

这可能是太多行了,而且您可能需要一些其他方法来处理(例如)只获取日期而不是完整日期的时间。但是,您应该按caluse常规地指定组中查询的所有非聚合列。请参阅可拓MySQL群

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34972484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档