2014-04-15 59 views
0

基本情景:我有3種類型的產品,有幾種製造商,根據客戶的位置,產品來自最近的製造商。我有一些幾乎可以工作的東西,但我認爲我的表格需要更好一些。哪個MySQL查詢根據位置選擇產品

這裏是我目前:

CREATE TABLE IF NOT EXISTS `mfr` (
    `id` int(11) NOT NULL auto_increment, 
    `zip_code` int(5) NOT NULL, 
    `radius` int(5) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 

INSERT INTO `mfr` (`id`, `zip_code`, `radius`) VALUES 
(1, 72756, 500), 
(2, 74030, 360), 
(3, 74701, 325), 
(4, 72947, 300), 
(5, 73112, 40), 
(6, 63077, 100), 
(7, 63106, 75); 

CREATE TABLE IF NOT EXISTS `models` (
    `id` int(11) NOT NULL auto_increment, 
    `name` varchar(50) NOT NULL, 
    `mfr_id` int(5) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 

INSERT INTO `models` (`id`, `name`, `mfr_id`) VALUES 
(1, 'model 1', 1), 
(2, 'model 2', 2), 
(3, 'model 3', 2), 
(4, 'model 1', 6), 
(5, 'model 2', 4), 
(6, 'model 3', 4); 

CREATE TABLE IF NOT EXISTS `distances` (
    `id` int(11) NOT NULL auto_increment, 
    `time_inserted` int(11) NOT NULL, 
    `zip_code` int(5) NOT NULL, 
    `mfr_id` int(5) NOT NULL, 
    `miles` int(5) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `zip_code` (`zip_code`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16 ; 

INSERT INTO `distances` (`id`, `time_inserted`, `zip_code`, `mfr_id`, `miles`) VALUES 
(1, 1397522155, 72761, 1, 41), 
(2, 1397522155, 72761, 2, 131), 
(3, 1397522155, 72761, 3, 223), 
(5, 1397522155, 72761, 5, 197), 
(6, 1397522156, 72761, 6, 301), 
(7, 1397522156, 72761, 7, 353), 
(8, 1397522166, 72761, 4, 87); 

預期結果: 的72761郵編應該爲模型1返回1 MFR_ID 41英里的4款2和3 MFR_ID與87英里,而是2 MFR_ID則返回模式2和3,即使milage是131,這是大於87

http://www.sqlfiddle.com/#!2/e450b/1/0

+0

您嘗試過哪些查詢? – hanleyhansen

回答

0

試試這個:

SELECT 
    m.name, 
    d.miles, 
    d.mfr_id 
FROM distances d 
    JOIN mfr ON mfr.id = d.mfr_id 
    AND mfr.radius > d.miles 
    JOIN models m ON m.mfr_id = mfr.id 
-- get min miles per model 
    JOIN (SELECT m1.name,min(d1.miles) miles 
     FROM models m1 
      JOIN distances d1 ON d1.mfr_id = m1.mfr_id 
     GROUP BY m1.name 
     ) md ON md.name = m.name 
      AND md.miles = d.miles 
WHERE d.zip_code = 72761 
ORDER BY d.miles ASC