Группа by избавляется от некоторых строк?

#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