2017-03-13 1 views
1

이 나는 ​​테이블의 제품 범주 데이터가없는 그러나MySQL의 세 방향 가입?

select p.product_name, count(t.product_id), avg(t.TTFF), std(t.TTFF) 
from product p left join 
    TTFFdata t 
    on p.product_id = t.product_id 
where planogram_id = 1 group by p.product_name 

planogram라는 설정 카테고리 "맥주"이 항목에 대한 TTFF 데이터를 검색하도록 다음과 같은 SQL을 개정 할 필요가 그래서 필요 어떻게 든 플래 노 그램 테이블의 범주에서 얻을 수 있습니다. 이런 식으로 뭔가,하지만 작동하도록 결합 적절한으로 :

select p.product_name, count(t.product_id), avg(t.TTFF), std(t.TTFF) 
from product p left join 
    TTFFdata t 
    on p.product_id = t.product_id 
where planogram.category = "beer" group by p.product_name 

두 가지 고려해야 할이 :

나는 매우 SQL과 experiencd 아니에요.

필자가 제공 한 데이터베이스가 잘못 구성되어 있다고 생각합니다 (제품에 카테고리 ID가 없습니까?).하지만 나는 그대로 사용해야합니다.

도움을 주시면 감사하겠습니다.

내가 함께 일하고 있어요 전체 SQL은 다음과 같습니다 :

-- phpMyAdmin SQL Dump 
-- version 4.6.5.2 
-- https://www.phpmyadmin.net/ 
-- 
-- Host: localhost 
-- Generation Time: Mar 08, 2017 at 07:50 PM 
-- Server version: 10.1.21-MariaDB 
-- PHP Version: 5.6.30 

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8mb4 */; 

-- 
-- Database: `chart` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `planogram` 
-- 

CREATE TABLE `planogram` (
    `planogram_id` int(11) NOT NULL, 
    `planogram_name` varchar(200) NOT NULL, 
    `project_name` varchar(200) NOT NULL, 
    `category` varchar(45) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `planogram` 
-- 

INSERT INTO `planogram` (`planogram_id`, `planogram_name`, `project_name`, `category`) VALUES 
(1, 'planogramA', '', 'beer'), 
(2, 'planogramB', '', 'coffee'), 
(3, 'planogramC', '', 'coffee'), 
(4, 'planogramD', '', 'fruit'), 
(5, 'planogramE', '', 'beer'); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `product` 
-- 

CREATE TABLE `product` (
    `product_id` int(11) NOT NULL, 
    `product_name` varchar(200) NOT NULL, 
    `detail` varchar(200) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `product` 
-- 

INSERT INTO `product` (`product_id`, `product_name`, `detail`) VALUES 
(1, 'beer1', ''), 
(2, 'beer2', ''), 
(3, 'coffee1', ''), 
(4, 'coffee2', ''), 
(5, 'coffee3', ''), 
(6, 'coffee4', ''), 
(7, 'coffee5', ''), 
(8, 'coffee6', ''), 
(9, 'beer3', ''), 
(10, 'beer4', ''), 
(13, 'fruit1', ''), 
(14, 'fruit2', ''); 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `TTFFdata` 
-- 

CREATE TABLE `TTFFdata` (
    `record_id` int(11) NOT NULL, 
    `participant_id` varchar(45) NOT NULL, 
    `TTFF` decimal(10,2) NOT NULL, 
    `product_id` int(11) NOT NULL, 
    `planogram_id` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Dumping data for table `TTFFdata` 
-- 

INSERT INTO `TTFFdata` (`record_id`, `participant_id`, `TTFF`, `product_id`, `planogram_id`) VALUES 
(1, 'a1', '6.21', 1, 1), 
(2, 'a2', '5.70', 1, 1), 
(3, 'a3', '6.00', 1, 1), 
(4, 'b1', '3.40', 2, 1), 
(5, 'b2', '4.30', 2, 1), 
(6, 'b3', '6.00', 2, 1), 
(7, 'c1', '7.00', 3, 2), 
(8, 'c2', '8.00', 3, 2), 
(9, 'c3', '5.00', 3, 2), 
(10, 'd1', '8.90', 4, 2), 
(11, 'd2', '3.00', 4, 2), 
(12, 'd3', '4.50', 4, 2), 
(15, 'e1', '8.00', 5, 2), 
(16, 'e2', '9.00', 5, 2), 
(17, 'f1', '5.50', 6, 3), 
(18, 'f2', '5.00', 6, 3), 
(19, 'g1', '5.20', 7, 3), 
(20, 'g2', '3.60', 7, 3), 
(21, 'h1', '5.00', 8, 3), 
(22, 'h2', '5.10', 8, 3), 
(23, 'i1', '6.00', 13, 4), 
(24, 'i2', '7.00', 13, 4), 
(25, 'j1', '4.00', 14, 4), 
(26, 'j2', '6.00', 14, 4), 
(27, 'k1', '6.70', 9, 5), 
(28, 'k2', '6.10', 9, 5), 
(29, 'l1', '3.00', 10, 5), 
(30, 'l2', '5.00', 10, 5); 

-- 
-- Indexes for dumped tables 
-- 

-- 
-- Indexes for table `planogram` 
-- 
ALTER TABLE `planogram` 
    ADD PRIMARY KEY (`planogram_id`); 

-- 
-- Indexes for table `product` 
-- 
ALTER TABLE `product` 
    ADD PRIMARY KEY (`product_id`); 

-- 
-- Indexes for table `TTFFdata` 
-- 
ALTER TABLE `TTFFdata` 
    ADD PRIMARY KEY (`record_id`), 
    ADD KEY `product_id` (`product_id`), 
    ADD KEY `planogram_id` (`planogram_id`); 

-- 
-- AUTO_INCREMENT for dumped tables 
-- 

-- 
-- AUTO_INCREMENT for table `planogram` 
-- 
ALTER TABLE `planogram` 
    MODIFY `planogram_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6; 
-- 
-- AUTO_INCREMENT for table `product` 
-- 
ALTER TABLE `product` 
    MODIFY `product_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17; 
-- 
-- AUTO_INCREMENT for table `TTFFdata` 
-- 
ALTER TABLE `TTFFdata` 
    MODIFY `record_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=31; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

답변

1

당신은 모든 3 개 테이블을 포함 할 필요가 조인과 관련된 모든 분야에 의해 그룹화 올바른 출력을 얻을 수 있는지 확인하십시오. 샘플 데이터를 기반으로 각 제품은 단 하나의 평면도와 연관되어 있으므로 내 대답은 귀하의 전체 데이터에 적용된다고 가정 한 답변입니다.

select p.product_name, count(t.product_id), avg(t.TTFF), std(t.TTFF) 
from product p 
left join TTFFdata t on p.product_id = t.product_id 
left join planogram pl on t.planogram_id=pl.planogram_id 
where planogram.category = "beer" 
group by p.product_name 
+0

고맙습니다. 이 수준의 복잡성이 전문 개발 환경에서 일반적인지 궁금하거나, 일반적으로 데이터베이스를 더 잘 구축 할 것으로 기대한다면 (예 : 제품에 카테고리가 추가됨) 궁금합니다. – Robin

+0

나를 믿어, 3 개의 테이블을 결합하는 것은 매우 일반적인 작업이지 복잡한 작업이 아닙니다. 나는 그것이 무엇인지를 알지 못하기 때문에 당신의 DB 구조에 대해서 정말로 언급 할 수 없다. – Shadow