#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 для меня для тестирования. Если вы уже решили эту проблему, пожалуйста, отправьте ответ и примите его, чтобы эта страница считалась решенной.