#mysql
#mysql
Вопрос:
Запрос предназначен для отображения всех записей из tbltransactions, сгруппированных по идентификатору клиента, и выбора имен клиентов из tblcustomers, где идентификаторы клиентов обеих таблиц совпадают.
select
a.customerid,
sum(transactionamount) as transactionamount,
b.customername
from
tbltransactions a,
tblcustomers b
where
a.customerid = b.customerid
group by customerid
order by b.customername
Гарантирует ли этот запрос, что все записи в tbltransactions отображаются правильно. Я новичок в MySQL и php. Спасибо
Во-вторых:
когда я добавляю «a.» в sum(transactionamount) как transactionamount», это выдает ошибку почему это так? Более того, что это за запрос соединения.
Комментарии:
1. Почему бы не попробовать запустить этот запрос в окне консоли / запроса и посмотреть, дает ли это результат, который вы ищете?
2. Вам было бы в 100 раз проще запустить этот запрос и сообщить нам , работает он или нет
3. Вы должны использовать ВНУТРЕННЕЕ соединение w3schools.com/sql/sql_join_inner.asp
4. пока запрос работает хорошо, но я не уверен, подходит ли он для любого набора данных, поэтому задал этот вопрос
Ответ №1:
Попробуйте это..
select a.customerid, sum(transactionamount) as transactionamount, b.customername from tbltransactions a INNER JOIN tblcustomers b ON a.customerid = b.customerid group by customerid order by b.customername
Комментарии:
1. Спасибо, но почему он должен быть лучше, чем рассматриваемый запрос? Пожалуйста, объясните, насколько мне известно
2. Я также упомянул ссылку (учебное пособие по внутреннему соединению) в комментарии.
3. в нем говорится: «Ключевое слово INNER JOIN выбирает все строки из обеих таблиц, если между столбцами в обеих таблицах есть совпадение».
4. к сожалению, мне нужны все записи из tbltransactions и только те из tblcustomers, где совпадают идентификаторы клиентов
Ответ №2:
В ANSI SQL неагрегированный столбец не может быть выбран при GROUP BY
использовании. Можно выбрать только агрегированный столбец и агрегированную функцию. В вашем запросе b.customername
он не может быть выбран, поскольку используется только a.customerid
агрегированный столбец.
Но MySQL реализует нестандартные. Таким образом, ваш запрос хорошо работает без синтаксических ошибок и выдает правильные результаты, если a.customerid
и b.customername
имеет взаимно однозначное отношение.
Но допустимый синтаксис SQL выглядит следующим образом:
SELECT a.customerid, transactionamount,
b.customername
FROM (
SELECT
customerid,
SUM(transactionamount) as transactionamount,
FROM
tbltransactions
GROUP BY customerid
) AS a INNER JOIN tblcustomers b ON a.customerid = b.customerid
ORDER BY b.customername;
Вы получите сообщение об ошибке при выполнении вашего запроса с помощью SET sql_mode = 'ONLY_FULL_GROUP_BY';
Спасибо, что прочитали мой плохой английский.
Комментарии:
1. Спасибо за правильный синтаксис!