Php 根据位置选择哪个MySQL查询产品
基本场景:我有3种产品,几个制造商,根据客户的位置,产品来自最近的制造商。我有一些几乎可以用的东西,但我认为我的桌子需要构造得更好一些 以下是我目前的情况:Php 根据位置选择哪个MySQL查询产品,php,mysql,sql,database,Php,Mysql,Sql,Database,基本场景:我有3种产品,几个制造商,根据客户的位置,产品来自最近的制造商。我有一些几乎可以用的东西,但我认为我的桌子需要构造得更好一些 以下是我目前的情况: 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
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应为41英里的车型1返回mfr_id 1,为87英里的车型2和3返回mfr_id 4,但为2和3车型返回mfr_id 2,即使里程数为131,大于87
试试这个:
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
你试过什么问题?