#mysql #group-by
#mysql #группа по
Вопрос:
У меня есть этот запрос
SELECT *, bp.product_id
FROM builder_product as bp
JOIN builder_step as bs
ON bs.builder_id=bp.builder_id
JOIN builder as b
ON b.builder_id=bs.builder_id
WHERE b.business_id = '60'
GROUP BY product_id
ORDER BY bs.step_number
который собирает все продукты из builder_product
таблицы, и все выглядит нормально, но при ближайшем рассмотрении в данных отсутствует несколько записей, и все имена одинаковы.
Вот данные и схема, и в основном то, что я хочу, — это запрос, который выдает мне все продукты из builder_product
таблицы и соответствующее имя из builder_step
таблицы с business_id
числом 60 из builder table
.
Есть идеи, что я делаю не так и как избежать дубликатов?
Ответ №1:
Из вашей схемы неясно, связаны ли builder_product
и builder_step
by builder_id
или by builder_step_id
. Если вы уточните, что я изменю ответ ниже.
Вы не выполняете никаких агрегатных функций ( SUM(), COUNT(), AVG()
), поэтому вам не нужен a GROUP BY
. Вместо этого у вас есть только пара JOIN
s для выполнения:
SELECT
bp.*,
bs.name
FROM
builder_product bp
JOIN builder_step bs ON bp.builder_step_id = bs.builder_step_id
JOIN builder b ON bp.builder_id = b.builder_id
WHERE b.business_id = 60
Дубликаты являются результатом попытки SELECT *
без указания имени / псевдонима таблицы. Вместо SELECT bp.*, bs.name
этого указывает, что конкретно builder_product
должны быть возвращены все столбцы from , плюс builder_name
столбец from builder_step
.
Комментарии:
1. я сделал это, и он возвращает 176 записей, а у меня всего 22 продукта… я что-то упускаю
2. вот почему я создал группу by из-за этого запроса, возвращающего 176 строк
3. они связаны builder_step_id
4. @Tamer Вероятно, неправильное условие соединения между bs и bp. Попробуйте отредактировать выше.
Ответ №2:
Вы не должны выбирать строки, которые не перечислены в предложении group by .
MySQL позволяет это, но есть ошибки.
Большинство других SQL выдают ошибку в вашем запросе.
Перепишите его на:
SELECT bp.*, bs.*, b.*
FROM FROM builder_product as bp
INNER JOIN builder_step as bs ON bs.builder_id=bp.builder_id
INNER JOIN builder as b ON b.builder_id=bs.builder_id
WHERE bp.product_id IN
(
SELECT bp1.product_id
FROM builder_product as bp1
JOIN builder_step as bs1 ON bs1.builder_id = bp1.builder_id
JOIN builder as b1 ON b1.builder_id = bs1.builder_id
WHERE b1.business_id = '60'
GROUP BY bp1.product_id
)
AND b.business_id = '60'
ORDER BY bs.step_number