Сумма Mysql с предложением GROUP BY и WHERE

#php #mysql #group-by

#php #mysql #группировка по

Вопрос:

У меня есть три таблицы и добавлены объединения для ссылки на предложение where и ограничения результатов.

Без предложения where SUM и GROUP BY хорошо работают со всеми записями таблицы. Но если я попытаюсь ограничить результаты до tool.id это не работает.

заказы

 ID | tool_id  | 
1  |    1     | 
2  |    1     |  
3  |    1     |
4  |    2     |      
  

postitions_list

 ID | order_id | optionindex | 
1  |    1     |  1          |  
2  |    1     |  2          |  
3  |    1     |  1          |  
4  |    2     |  4          |               
  

Инструменты

 ID | Number   |
1  |   10     | 
2  |   20     |  
3  |   30     |        
  

запрос

 SELECT
orders.id,
orders.tool_id,
positions_list.order_id,
positions_list.optionindex,
tools.id,
tools.tool_number,
SUM(positions_list.optionindex) AS optionindex

FROM positions_list

LEFT JOIN orders
ON orders.id=positions_list.order_id

LEFT JOIN tools  
ON  tools.id=orders.tool_id

WHERE
tools.id = :id 

GROUP BY positions_list.optionindex
  

Что мне нужно, так это

результаты запроса на основе заданных tool.id

 ID | tool_id | optionindex | optionindex 
1  |  1      | 1           |  2
2  |  1      | 2           |  1
3  |  1      | 3           |  0   
4  |  1      | 4           |  0   
  

Кроме того, следующим шагом будет получение optionindex.content

optionindex

 ID | content  | 
1  |  Value1  | 
2  |  Value2  |  
3  |  Value3  |  
4  |  Value4  |    
  

Итак, результат запроса, который мне в конечном итоге нужен, это:

результаты запроса на основе заданных tool.id

 ID | tool_id | optionindex | optionindex | optionindex.content
1  |  1      | 1           |  2          | Value1
2  |  1      | 2           |  1          | Value2
3  |  1      | 3           |  0          | Value3
4  |  1      | 4           |  0          | Value4
  

Комментарии:

1. Вы не можете этого сделать WHERE tools.id = :id , если tools — это внешняя объединенная таблица (левая / правая / полная). Условие должно быть размещено как И критерии в соединении LEFT JOIN tools ON tools.id=orders.tool_id and tools.id = :id или ЛЕВОЕ соединение рассматривается как внутреннее соединение. В качестве альтернативы вы должны сделать это: WHERE tools.id = :id or tools.id is null но это неэффективно, поскольку OR сводит на нет использование индекса.

2. Спасибо, но, возможно, в моем запросе есть другая проблема, потому что результат все еще не соответствует требованиям. Он СУММИРУЕТ все записи из таблицы, не ограничиваясь tool.id .

3. в группе by должны быть перечислены все столбцы, не входящие в агрегированные данные, если только значение этих столбцов не идентично для всех выбранных записей. Лучшая форма — всегда включать все столбцы, не входящие в агрегат, в вашу группу by

4. Этот вопрос относительно ясен, но поскольку я часто отвечаю со своего телефона, я могу предоставить поддержку только в течение ограниченного времени, если вы создадите dbfiddle для меня для тестирования. Если вы уже решили эту проблему, пожалуйста, отправьте ответ и примите его, чтобы эта страница считалась решенной.