#sql #sum
Вопрос:
пример
CREATE TABLE book( title VARCHAR(100) PRIMARY KEY, price INT NOT NULL ) CREATE TABLE buyer( name VARCHAR(20) , title VARCHAR(100), primary key(name,title), foreign key(title) references book )
Я опущу код для ввода данных
book data = {('a',100),('b',200),('c',100),('d',300)} buyer data = {('kim','a'),('kim','b'),('ca','c'),('yan','d'),('yan','c')} select name, sum(price) sum_price from book,buyer group by name
Я хочу знать общее количество по имени
но этот результат — сумма всех книг.
Я не знаю, в чем проблема
Комментарии:
1. Совет сегодняшнего дня: Переключитесь на современный, явный
JOIN
синтаксис. Легче писать ( без ошибок ), легче читать (и поддерживать), и легче конвертировать во внешнее соединение, если это необходимо.2.
book, buyer
это то жеCROSS JOIN
самое, что . Просто проверьте результат сSELECT *
безGROUP BY
предложения
Ответ №1:
Соединение двух таблиц без условия соединения создает полное декартово произведение двух таблиц.
Попробуйте это, должно решить вашу проблему.
select name, sum(price) sum_price from buyer br left join book bk on br.title=bk.title group by name
Ответ №2:
Это связано с тем, что вы не выполнили правильное соединение, и в результате вы получили перекрестное соединение, что означает, что каждая строка book
таблицы будет соединена с каждой строкой buyer
таблицы. Попробуйте либо добавить where
инструкцию с правильным соединением 2 таблиц, либо использовать join
синтаксис в from
части.
Комментарии:
1. перекрестное соединение, а не полное внешнее соединение.
2. да, ты прав @jarlh!