Многие присоединяются. Некоторые из них являются недействительными. JOIN
является сокращением от INNER JOIN
и нуждается в предложении ON
или USING
. MySQL, однако, тихо преобразует JOIN
в CROSS JOIN
, когда вы забываете предложение. Это может привести к ужасным ошибкам, но у вас есть скрытые критерии в вашем предложении WHERE
, поэтому, насколько я вижу, все таблицы объединены правильно.
Во всяком случае, многие объединения не нужны. Зачем присоединяться к bauteil
например? Может быть много bauteil
на produktion
, поэтому вы умножаете результат на количество сотен. То же самое с product_configurationelement
, product_configurationelement_value
, product_generation
и product_modification
Я думаю. Тогда есть лишние объединения к kunden
, produkt
и т. Д.
Если я не ошибаюсь, это именно то, что вам нужно: все product_material
объединены с produktion
с проектом, соответствующим диапазону дат, сгруппированным по material_id
, чтобы получить по одной строке результатов на материал.
SELECT
pm.material_id,
SUM(pm.amount_construction * produktion.anzahl) as total_amount
FROM product_material pm
JOIN produkt p ON p.product_generation_id = pm.product_generation_id
JOIN produktion ON produktion.produkt = p.id and produktion.anzahl > 0
WHERE produktion.projekt IN (SELECT id FROM projekt WHERE starttermin <= date '2018-07-05')
GROUP BY pm.material_id
ORDER BY pm.material_id;