MySQL выбирает смены в один ряд - PullRequest
0 голосов
/ 20 мая 2011

Поскольку это странный вопрос, я не смог найти правильный ответ.Я разрабатываю интранет для моей компании, используя codeigniter.У меня есть синтаксис запроса, который позволяет мне получить все продукты в данный день:

$query = $this->db
         ->select('
             stock_meta.code_company AS product,
             stock_meta.company AS company,
             stock_meta.factory AS factory,
             COUNT(production.product) AS total_product
             ')
         ->from('production')
         ->join('stock_meta', 'production.product = stock_meta.code_local', 'inner')
         ->where('date BETWEEN ' . $start_date . ' AND ' . $end_date)
         ->group_by('product')
         ->order_by('factory')
         ->get();

, и здесь это синтаксис MySQL:

SELECT
    stock_meta.code_company AS product,
    stock_meta.company AS company,
    stock_meta.factory AS total_product
FROM
    production
INNER JOIN
    stock_meta ON production.product = stock_meta.code_local
WHERE
    date BETWEEN 1304208650 AND 1304280234
GROUP BY
    product
ORDER BY
    factory

Я вызываю этот запрос только один раз.

Я получаю такой результат:

| product  | company  | factory  | total_product  |
+----------+----------+----------+----------------+
| 231234   | A        | Fac1     | 475            |
| 245214   | A        | Fac2     | 246            |
+----------+----------+----------+----------------+

И он прекрасно работает.Но мне нужно получить производство между рабочими сменами.Есть смены деревьев: с 00:00 до 08:00, с 08:00 до 16:00, с 16:00 до 24:00.Как я могу получить рабочие смены для каждого продукта?

Я имею в виду, что мне нужно получить такой результат:

| product  | company  | factory  | shift1  | shift2  | shift3  | total_product  |
+----------+----------+----------+---------+---------+---------+----------------+
| 231234   | A        | Fac1     | 100     | 200     | 175     | 475            |
| 245214   | A        | Fac2     | 46      | 50      | 150     | 246            |
| 500231   | B        | aFaca1   | 46      | 50      | 150     | 246            |
+----------+----------+----------+---------+---------+---------+----------------+

А мои Таблицы вот так:

CREATE TABLE IF NOT EXISTS `production` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `factory` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
  `date` int(11) DEFAULT NULL,
  `operator` int(11) DEFAULT NULL,
  `product` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

CREATE TABLE IF NOT EXISTS `stock_meta` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `code_local` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL,
  `code_company` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `company` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
  `factory` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  `status` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=242 ;

Так.Есть идеи?

Редактировать: Я забыл упомянуть об этом.Я использую метку времени Unix.

Спасибо за совет.

Best Redgards.

Gokhan

1 Ответ

0 голосов
/ 20 мая 2011

Я устал и не должен больше писать код.Я думаю, что это будет выглядеть так.

SELECT
   stock_meta.code_company AS product,
   stock_meta.company AS company,
   stock_meta.factory AS total_product,
   s1.shift1,
   s2.shift2,
   s2.shift3,
   stock_meta.factory AS total_product
FROM
   production
INNER JOIN
   stock_meta ON production.product = stock_meta.code_local
LEFT JOIN 
   ( SELECT stock_meta.code_company AS product, 
        COUNT(production.product) AS shift1
     FROM production, stock_meta
     WHERE production.product = stock_meta.code_local
     AND date BETWEEN '.$start_date.' AND '.strtotime('+8 hour', $start_date).'
   ) as s1 USING (product)
LEFT JOIN 
   ( SELECT stock_meta.code_company AS product, 
        COUNT(production.product) AS shift2
     FROM production, stock_meta
     WHERE production.product = stock_meta.code_local
     AND date BETWEEN '.strtotime('+8 hour', $start_date).' AND '.strtotime('+16 hour', $start_date).'
   ) as s3 USING (product)
LEFT JOIN 
   ( SELECT stock_meta.code_company AS product, 
       COUNT(production.product) AS shift3
     FROM production, stock_meta
     WHERE production.product = stock_meta.code_local
     AND date BETWEEN '.strtotime('+16 hour', $start_date).' AND '.strtotime('+24 hour', $start_date).'
   ) as s3 USING (product)
WHERE
   date BETWEEN '.$start_date.' AND '.strtotime('+16 hour', $start_date).'
GROUP BY
   product
ORDER BY
   total_product
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...