Я пытаюсь найти заказы только с одним элементом в базе данных, работающей на MySQL 5.7.23 на Ubuntu 18.04 LTS.Но почему-то MySQL не может сделать вывод, что COUNT(*) = 1
подразумевает функциональную зависимость.
Следующая база данных из 2 таблиц заказов с элементами заказов иллюстрирует ошибку:
DROP TABLE IF EXISTS t_o, t_oi;
CREATE TABLE t_o (
order_id INTEGER UNSIGNED PRIMARY KEY,
placed_on DATE NOT NULL,
INDEX (placed_on)
);
INSERT INTO t_o (order_id, placed_on) VALUES
(1, '2018-10-01'),
(2, '2018-10-02');
CREATE TABLE t_oi (
item_id INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
order_id INTEGER UNSIGNED NOT NULL,
sku VARCHAR(31) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL,
qty INTEGER UNSIGNED NOT NULL,
unit_price INTEGER UNSIGNED NOT NULL,
INDEX (sku),
FOREIGN KEY (order_id) REFERENCES t_o (order_id)
ON DELETE CASCADE ON UPDATE CASCADE
);
INSERT INTO t_oi (order_id, sku, qty, unit_price) VALUES
(1, 'SO', 1, 599),
(1, 'SF', 2, 399),
(2, 'SU', 1, 399);
SELECT t_oi.order_id, t_o.placed_on, t_oi.sku, t_oi.qty, t_oi.unit_price
FROM t_o
INNER JOIN t_oi ON t_o.order_id = t_oi.order_id
GROUP BY t_oi.order_id
HAVING COUNT(*) = 1
Я ожидаю, что этовернуть (2, '2018-10-02', 'SU', 1, 399)
, потому что это единственный заказ только с одним товаром.Я не хочу строк, где order_id = 1
, потому что в этом заказе более одного элемента.Но вместо этого MySQL выдает следующую ошибку:
# 1055 - Выражение № 3 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец phs_apps.t_oi.sku, который функционально не зависит отстолбцы в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by
В руководстве поясняется «функционально зависимый».Но есть ли способ выразить эту функциональную зависимость для MySQL, которая чище, чем наматывать MIN()
вокруг каждого выходного столбца, на который жалуется MySQL?Если это вообще возможно, я бы предпочел решение, которое не включает в себя объединение t_oi
дважды, один раз, чтобы найти соответствующие значения t_o.order_id
, и один раз, чтобы добавить детали каждого отдельного элемента каждого такого заказа, как включение таблицы водин запрос несовместим с использованием TEMPORARY TABLE
из-за 13-летней ошибки "Can't reopen table" .