Дает ли этот SQL-запрос правильные результаты?

#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. Спасибо за правильный синтаксис!