Оператор SELECT для всех деталей в одном ряду - PullRequest
1 голос
/ 21 февраля 2010

Есть две таблицы:

Продукты
ID (первичный ключ),
ProductName

PlannedByMonths
ProductID (первичный ключ) (ссылка на таблицу Products «многие к одному»),
MonthNumber (первичный ключ),
QtytoProduce

Как написать оператор SELECT для получения результатов в следующем формате?

ProductName, QtytoProduceMonth1, QtytoProduceMonth2, QtytoProduceMonth3, QtytoProduceMonth4, QtytoProduceMonth5, QtytoProduceMonth6, QtytoProduceMonth7, QtytoProduceMonth8, QtytoProduceMonth9, QtytoProduceMonth10, QtytoProduceMonth11, QtytoProduceMonth12

Ответы [ 4 ]

1 голос
/ 21 февраля 2010

Я не знаю, есть ли более простой способ поворота в MySQL, но это должно работать:

        select 
        (select descriptions from products d where d.productid = p.productid )
           description,
         max(if(month=1,Qty, null)) m1,
         max(if(month=2, Qty,null)) m2,
         max(if(month=3, Qty, null)) m3 
         /* more here */
         from Planned p 
         group by productid  ;
1 голос
/ 21 февраля 2010

Я до сих пор не уверен, что это не самое плохое технологическое достижение со времени телевизионных обедов, но начиная с версии 4.1 MySQL имеет функцию GROUP_CONCAT(), которая делает то, что вы хотите:

  SELECT p.ProductName
         , group_concat(pbm.QtytoProduce order by pbm.MonthNumber)
    FROM Products p
         INNER JOIN PlannedByMonths pbm
         ON p.ID = pbm.ProductID
GROUP BY p.prodname

Возвращает одну строку для каждого ProductName, содержащую:

  1. ProductName и
  2. QtytoProduce для каждого MonthNumber в BLOB .
0 голосов
/ 29 апреля 2010

Не делай этого.

Поместите свою бизнес-логику за пределы запроса. Переместите запрос формы бизнес-логики в код.

Бизнес-логику в запросе сложно поддерживать, сложно расширять и она дает вам небольшие возможности для манипулирования Если вам нравится сложная бизнес-логика для размещения на уровне базы данных, используйте хранимые процедуры. В противном случае используйте код для создания бизнес-логики.

С уважением

0 голосов
/ 21 февраля 2010

Для этого вам нужно 12 объединений:

select ProductName, pbm1.QtytoProduce, pbm2.QtytoProduce, pbm3.QtytoProduce, pbm4.QtytoProduce, pbm5.QtytoProduce, pbm6.QtytoProduce, pbm7.QtytoProduce, pbm8.QtytoProduce, pbm9.QtytoProduce, pbm10.QtytoProduce, pbm11.QtytoProduce, pbm12.QtytoProduce from Products p
left join PlannedByMonths pbm1 on p.ID=pbm1.ProductID and pbm1.MonthNumber=1
left join PlannedByMonths pbm1 on p.ID=pbm2.ProductID and pbm2.MonthNumber=2
left join PlannedByMonths pbm1 on p.ID=pbm3.ProductID and pbm3.MonthNumber=3
left join PlannedByMonths pbm1 on p.ID=pbm4.ProductID and pbm4.MonthNumber=4
left join PlannedByMonths pbm1 on p.ID=pbm5.ProductID and pbm5.MonthNumber=5
left join PlannedByMonths pbm1 on p.ID=pbm6.ProductID and pbm6.MonthNumber=6
left join PlannedByMonths pbm1 on p.ID=pbm7.ProductID and pbm7.MonthNumber=7
left join PlannedByMonths pbm1 on p.ID=pbm8.ProductID and pbm8.MonthNumber=8
left join PlannedByMonths pbm1 on p.ID=pbm9.ProductID and pbm9.MonthNumber=9
left join PlannedByMonths pbm1 on p.ID=pbm10.ProductID and pbm10.MonthNumber=10
left join PlannedByMonths pbm1 on p.ID=pbm11.ProductID and pbm11.MonthNumber=11
left join PlannedByMonths pbm1 on p.ID=pbm12.ProductID and pbm12.MonthNumber=12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...