首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取错误代码: 1055。即使我使用MySQL ()

获取错误代码: 1055。即使我使用MySQL ()
EN

Stack Overflow用户
提问于 2019-04-20 16:08:06
回答 1查看 97关注 0票数 2

我有表和数据来重现错误:

代码语言:javascript
复制
DROP DATABASE IF EXISTS `theway`;

CREATE DATABASE IF NOT EXISTS `theway`
    DEFAULT CHARACTER SET utf8
    DEFAULT COLLATE utf8_general_ci;

USE `theway`;

DROP TABLE IF EXISTS fault;
CREATE TABLE IF NOT EXISTS fault (
    shorthand    VARCHAR(10) NOT NULL PRIMARY KEY,
    title        VARCHAR(255) NOT NULL,
    score        TINYINT NOT NULL -- 0 to 255
);

INSERT INTO fault (shorthand, title, score)
VALUES ('PARTY', 'Party with alcohol', 60);
INSERT INTO fault (shorthand, title, score)
VALUES ('WORK', 'Skip minimum 6 hour workday', 50);
INSERT INTO fault (shorthand, title, score)
VALUES ('SMOKE', 'Smoke', 50);
INSERT INTO fault (shorthand, title, score)
VALUES ('COFFEE', 'Coffee / Caffeine', 20);
INSERT INTO fault (shorthand, title, score)
VALUES ('FOOD', 'Crap food', 15);
INSERT INTO fault (shorthand, title, score)
VALUES ('ROUTINE', 'Skip daily routines', 15);
INSERT INTO fault (shorthand, title, score)
VALUES ('WORKOUT', 'Skip workout', 15);
INSERT INTO fault (shorthand, title, score)
VALUES ('SLEEP', 'Oversleep to exhaustion', 10);

DROP TABLE IF EXISTS day;
CREATE TABLE IF NOT EXISTS day (
    date         DATE NOT NULL PRIMARY KEY,
    hours_worked TINYINT NOT NULL,
    note         VARCHAR(1028) NOT NULL
);

DROP TABLE IF EXISTS day_has_fault;
CREATE TABLE IF NOT EXISTS day_has_fault (
    day_date         DATE NOT NULL,
    fault_shorthand  VARCHAR(10) NOT NULL,
    PRIMARY KEY (day_date, fault_shorthand)
);

ALTER TABLE day_has_fault ADD CONSTRAINT fk__day_has_fault__day__day_date FOREIGN KEY (day_date) REFERENCES day (date);
ALTER TABLE day_has_fault ADD CONSTRAINT fk__day_has_fault__fault__fault_shorthand FOREIGN KEY (fault_shorthand) REFERENCES fault (shorthand);

INSERT INTO day (date, hours_worked, note)
VALUES ('2019-04-20', 4, 'Just some regular day.');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-20', 'SLEEP');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-20', 'WORK');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-20', 'ROUTINE');

INSERT INTO day (date, hours_worked, note)
VALUES ('2019-04-21', 6, 'Atleast did 6 hours minimum.');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-21', 'SLEEP');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-21', 'WORKOUT');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-21', 'FOOD');

INSERT INTO day (date, hours_worked, note)
VALUES ('2019-04-22', 2, 'Only two hours here.');
INSERT INTO day_has_fault (day_date, fault_shorthand)
VALUES ('2019-04-22', 'WORK');

INSERT INTO day (date, hours_worked, note)
VALUES ('2019-04-23', 12, '12 hours work awesome.');

第一个没有错误的查询:

代码语言:javascript
复制
SELECT
    day.date,
    day.hours_worked,
    day.note,
    day_has_fault.fault_shorthand,
    fault.score
FROM day
LEFT JOIN day_has_fault
    ON day_has_fault.day_date = day.date
LEFT JOIN fault
    ON fault.shorthand = day_has_fault.fault_shorthand;

当我将求和和按组相加时,我得到了错误:

代码语言:javascript
复制
SELECT
    day.date,
    day.hours_worked,
    day.note,
    day_has_fault.fault_shorthand,
    fault.score,
    sum(fault.score) as fault_sum
FROM day
LEFT JOIN day_has_fault
    ON day_has_fault.day_date = day.date
LEFT JOIN fault
    ON fault.shorthand = day_has_fault.fault_shorthand
GROUP BY day.date;

这是整个错误响应:

代码语言:javascript
复制
Error Code: 1055. Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'theway.day_has_fault.fault_shorthand' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

我曾尝试在day.hours_worked和day.note上使用day.hours_worked(),但效果不太好。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-20 16:28:53

初始查询的结果可以按以下方法分组:

代码语言:javascript
复制
day.date, day.hours_worked, day.note

但不是靠

代码语言:javascript
复制
day_has_fault.fault_shorthand, fault.score

因为您正在对fault.score进行总结,所以请执行以下操作:

代码语言:javascript
复制
SELECT
    day.date,
    day.hours_worked,
    day.note,
    sum(fault.score) as fault_sum
FROM day
LEFT JOIN day_has_fault
    ON day_has_fault.day_date = day.date
LEFT JOIN fault
    ON fault.shorthand = day_has_fault.fault_shorthand
GROUP BY day.date,
    day.hours_worked,
    day.note;

演示

其结果是:

代码语言:javascript
复制
| date       | hours_worked | note                         | fault_sum |
| ---------- | ------------ | ---------------------------- | --------- |
| 2019-04-20 | 4            | Just some regular day.       | 75        |
| 2019-04-21 | 6            | Atleast did 6 hours minimum. | 40        |
| 2019-04-22 | 2            | Only two hours here.         | 50        |
| 2019-04-23 | 12           | 12 hours work awesome.       |           |

您可以这样使用any_value()

代码语言:javascript
复制
SELECT
    day.date,
    day.hours_worked,
    day.note,
    any_value(day_has_fault.fault_shorthand) fault_shorthand,
    any_value(fault.score) score,
    sum(fault.score) as fault_sum
FROM day
LEFT JOIN day_has_fault
    ON day_has_fault.day_date = day.date
LEFT JOIN fault
    ON fault.shorthand = day_has_fault.fault_shorthand
GROUP BY day.date;

并为列fault_shorthandscore获得不可预测的结果,如:

代码语言:javascript
复制
| date       | hours_worked | note                         | fault_shorthand | score | fault_sum |
| ---------- | ------------ | ---------------------------- | --------------- | ----- | --------- |
| 2019-04-20 | 4            | Just some regular day.       | ROUTINE         | 15    | 75        |
| 2019-04-21 | 6            | Atleast did 6 hours minimum. | FOOD            | 15    | 40        |
| 2019-04-22 | 2            | Only two hours here.         | WORK            | 50    | 50        |
| 2019-04-23 | 12           | 12 hours work awesome.       |                 |       |           |

编辑

可以将fault.shorthand值与group_concat()分隔成组逗号。

代码语言:javascript
复制
SELECT
    day.date,
    day.hours_worked,
    day.note,
    sum(fault.score) as fault_sum,
    group_concat(fault.shorthand) shorthand
FROM day
LEFT JOIN day_has_fault
    ON day_has_fault.day_date = day.date
LEFT JOIN fault
    ON fault.shorthand = day_has_fault.fault_shorthand
GROUP BY day.date,
    day.hours_worked,
    day.note;

演示

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

https://stackoverflow.com/questions/55775308

复制
相关文章

相似问题

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