Есть 4 таблицы:
----- Price ----- - Materials - - TypeMat - - MarkMat - - Formats -
|----------------| |--------------| |-----------| |-----------| |----------|
|ID-------------| |ID-----------| |ID--------| |ID---------| |ID-------|
|Material_ID-| |TM_ID------| |Name----| |Name-----| |Name---|
|Price---------| |MM_ID------| |-----------| |------------| |----------|
|---------------| |Format_ID-|
Результат следующего запроса имеет вид:
SELECT tm.Name, mm.Name, m.Format_ID, p.Price
FROM Price p
LEFT JOIN Materials m ON (.Material_ID=m.ID)
LEFt JOIN TypeMat tm ON (m.TM_ID=tm.ID)
LEFt JOIN MarkMat mm ON (m.MM_ID=mm.ID)
- Тип ---| - Марка - |Формат | Цена
Бумага | Xerox -----| ---1---| --- 15
Бумага | Xerox -----| ---2---| --- 25
Бумага | Colorset --| ---1---| --- 10
Бумага | Colorset --| ---2---| --- 20
Картон | Цветной -| ---1---| --- 50
Необходимо построить запрос, результат которого должен выглядеть так:
- Тип ---| - Марка - |Формат1 | Формат2
Бумага | Xerox -----| --- 15 ----| 25
Бумага | Colorset --| --- 10 ----| 20
Картон | Цветной -| --- 50 ----| 'НЕТ'
Народ, помогите сделать простейший запрос
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
Код: Выделить всё
SELECT
tm.Name AS Тип,
mm.Name AS Марка,
IF(ISNULL(p1.Price),'\'НЕТ\'',p1.Price) AS Формат1,
IF(ISNULL(p2.Price),'\'НЕТ\'',p2.Price) AS Формат2
FROM
Formats f1,
Formats f2,
TypeMat tm,
MarkMat mm
LEFT JOIN Materials m1 ON (m1.Format_ID = f1.ID AND m1.TM_ID = tm.ID AND m1.MM_ID = mm.ID)
LEFT JOIN Price p1 ON (p1.Material_ID = m1.ID)
LEFT JOIN Materials m2 ON (m2.Format_ID = f2.ID AND m2.TM_ID = tm.ID AND m2.MM_ID = mm.ID)
LEFT JOIN Price p2 ON (p2.Material_ID = m2.ID)
WHERE
f1.Name = 1
AND
f2.Name = 2
AND NOT (p1.Price IS NULL AND p2.Price IS NULL)
GROUP BY
mm.ID,
tm.ID;
Немного не то. Запрос на MySQL - вложенные не понимает. Нужно что-то типа:
SELECT pm.Price, pm1.Price
FROM price_fprint_mat pm
LEFT JOIN materials m ON ( pm.Material_ID = m.ID AND m.Format_ID =1 )
LEFT JOIN materials m1 ON ( pm1.Material_ID = m1.ID AND m1.Format_ID =2 )
INNER JOIN price pm1 ON ( m.TypeMaterial_ID = m1.TypeMaterial_ID
AND m.MarkMaterial_ID = m1.MarkMaterial_ID )
LEFT JOIN typemat mt ON ( m.TypeMaterial_ID = mt.ID )
LEFT JOIN markmat mm ON ( m.MarkMaterial_ID = mm.ID )
Этот запрос возвращает только полное соответствие:
- Тип ---| - Марка - |Формат1 | Формат2
Бумага | Xerox -----| --- 15 ----| 25
Бумага | Colorset --| --- 10 ----| 20
А последнюю строку (такие строки) нужно как-то вычислять подругому и присоединять к запросу.
SELECT pm.Price, pm1.Price
FROM price_fprint_mat pm
LEFT JOIN materials m ON ( pm.Material_ID = m.ID AND m.Format_ID =1 )
LEFT JOIN materials m1 ON ( pm1.Material_ID = m1.ID AND m1.Format_ID =2 )
INNER JOIN price pm1 ON ( m.TypeMaterial_ID = m1.TypeMaterial_ID
AND m.MarkMaterial_ID = m1.MarkMaterial_ID )
LEFT JOIN typemat mt ON ( m.TypeMaterial_ID = mt.ID )
LEFT JOIN markmat mm ON ( m.MarkMaterial_ID = mm.ID )
Этот запрос возвращает только полное соответствие:
- Тип ---| - Марка - |Формат1 | Формат2
Бумага | Xerox -----| --- 15 ----| 25
Бумага | Colorset --| --- 10 ----| 20
А последнюю строку (такие строки) нужно как-то вычислять подругому и присоединять к запросу.
т.к. у меня MySQL, я и написал про вложенные запросы. Короче запрос вышел такой:
SELECT
IF( ISNULL( pm1.ID ), pm2.ID, pm1.ID ) AS ID,
pm1.ID AS ID1, pm2.ID AS ID2,
SUBSTRING( CONCAT( mt.Name, ' ', mm.Name ) , 1, 100 ) AS Mat,
IF( ISNULL( pm1.Price1 ) , 'НЕТ', pm1.Price1 ) AS Price1,
IF( ISNULL( pm2.Price1 ) , 'НЕТ', pm2.Price1 ) AS Price2
FROM price pm, materials m1
LEFT JOIN price pm1 ON ( m1.ID = pm1.Material_ID AND m1.Format_ID =1 )
LEFT JOIN materials m2 ON ( m2.Format_ID =2
AND m1.TypeMaterial_ID = m2.TypeMaterial_ID
AND m1.MarkMaterial_ID = m2.MarkMaterial_ID)
LEFT JOIN price pm2 ON ( m2.ID = pm2.Material_ID )
LEFT JOIN material_type mt ON ( m2.TypeMaterial_ID = mt.ID )
LEFT JOIN material_mark mm ON ( m2.MarkMaterial_ID = mm.ID )
WHERE pm.Office_ID=1
GROUP BY m2.TypeMaterial_ID, m2.MarkMaterial_ID
HAVING NOT ( ISNULL(ID1) AND ISNULL(ID2) )
ORDER BY mt.Name, mm.Name
SELECT
IF( ISNULL( pm1.ID ), pm2.ID, pm1.ID ) AS ID,
pm1.ID AS ID1, pm2.ID AS ID2,
SUBSTRING( CONCAT( mt.Name, ' ', mm.Name ) , 1, 100 ) AS Mat,
IF( ISNULL( pm1.Price1 ) , 'НЕТ', pm1.Price1 ) AS Price1,
IF( ISNULL( pm2.Price1 ) , 'НЕТ', pm2.Price1 ) AS Price2
FROM price pm, materials m1
LEFT JOIN price pm1 ON ( m1.ID = pm1.Material_ID AND m1.Format_ID =1 )
LEFT JOIN materials m2 ON ( m2.Format_ID =2
AND m1.TypeMaterial_ID = m2.TypeMaterial_ID
AND m1.MarkMaterial_ID = m2.MarkMaterial_ID)
LEFT JOIN price pm2 ON ( m2.ID = pm2.Material_ID )
LEFT JOIN material_type mt ON ( m2.TypeMaterial_ID = mt.ID )
LEFT JOIN material_mark mm ON ( m2.MarkMaterial_ID = mm.ID )
WHERE pm.Office_ID=1
GROUP BY m2.TypeMaterial_ID, m2.MarkMaterial_ID
HAVING NOT ( ISNULL(ID1) AND ISNULL(ID2) )
ORDER BY mt.Name, mm.Name