Группировать по запросу в MySQL, игнорируя значения в скобках

У меня есть запрос SQL с предложением groupby запрос выглядит так:

SELECT
    products.product_name AS product_name,
    contracts_balance.contract_prod AS contract_prod, 
     SUM( contracts.opt_one_firm + contracts.opt_two_firm + contracts.opt_three_firm +contracts.opt_four_firm +contracts.opt_five_firm +contracts.opt_six_firm)
     AS total_open_balance
FROM
    (
        (
            contracts_balance
        LEFT JOIN products ON
            (
                (
                    contracts_balance.product_id_fk = products.product_id
                )
            )
        )
    LEFT JOIN supplier ON
        (
            (
                products.supplier_id_fk = supplier.supplier_id
            )
        )

         LEFT JOIN contracts ON
        (
            (
                contracts_balance.contract_id_fk = contracts.contract_id
            )
        )
    )
GROUP BY
    products.product_name ,  products.pack_size

Вывод выглядит следующим образом:

В группе по запросу я хочу, чтобы запрос группировался по именам, игнорируя текст внутри скобок () Итак, он должен возвращать только 8 строк.

Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать substring_index():

SELECT SUBSTRING_INDEX(p.product_name, ' (', 1) AS product_name,
       cb.contract_prod AS contract_prod, 
       SUM( c.opt_one_firm + c.opt_two_firm + c.opt_three_firm + c.opt_four_firm + c.opt_five_firm + contracts.opt_six_firm) AS total_open_balance
FROM contracts_balance cb LEFT JOIN
     products p
     ON cb.product_id_fk = p.product_id LEFT JOIN
     supplier s
     ON p.supplier_id_fk = s.supplier_id LEFT JOIN
     contracts c
     ON cb.contract_id_fk = c.contract_id
GROUP BY SUBSTRING_INDEX(p.product_name, ' (', 1), cb.contract_prod;

Примечания:

  • Псевдонимы таблиц упрощают запись и чтение запроса.
  • Неагрегированные столбцы в SELECT должны соответствовать ключам GROUP BY. Я не понимаю, почему cb.contract_prod в SELECT, а не в GROUP BY и почему p.pack_size в GROUP BY, а не в SELECT.
  • Все эти круглые скобки и пробелы делают запрос более сложным, чем он есть на самом деле.

Также неправильно использовать LEFT JOINs в запросе и агрегировать по столбцу, которого нет в первой таблице, потому что он будет иметь NULL значения в несовпадающих строках. Я подозреваю, что вы хотите products в качестве первой ссылки на таблицу в FROM.

Другие вопросы по теме