Mysql 使用子查询选择最小值
我需要编写一个查询,从每个商户获取最低价格,并输出价格链接(p_链接)和一些其他信息,如商户名称+评级 我们有一个价格表(tgmp_价格)、一个商户表(tgmp_商户)和一个附属产品ID表(tgmp_附属公司) 我已经获得了获取我需要的所有价格和数据的查询:Mysql 使用子查询选择最小值,mysql,database,join,subquery,Mysql,Database,Join,Subquery,我需要编写一个查询,从每个商户获取最低价格,并输出价格链接(p_链接)和一些其他信息,如商户名称+评级 我们有一个价格表(tgmp_价格)、一个商户表(tgmp_商户)和一个附属产品ID表(tgmp_附属公司) 我已经获得了获取我需要的所有价格和数据的查询: SELECT p_id, p_m_id, p_prod_label, a_platform, p_link, p_price, m_title, m_link, m_avg_rating FROM tgmp_affiliates ga
SELECT p_id, p_m_id, p_prod_label, a_platform, p_link, p_price, m_title, m_link, m_avg_rating
FROM tgmp_affiliates ga
JOIN tgmp_prices p
ON ga.a_code = p.p_gtin
AND ga.a_code != ''
JOIN tgmp_merchants m
ON m.m_id = p.p_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
ORDER BY p.p_price ASC
我只需要按商户id(p.p_m_id或m.m_id)对价格进行分组,然后为每个商户选择最低价格
SELECT p_id, p_m_id, p_prod_label, a_platform, p_link, p_price, m_title, m_link, m_avg_rating
FROM tgmp_affiliates ga
JOIN tgmp_prices p
ON ga.a_code = p.p_gtin
AND ga.a_code != ''
JOIN tgmp_merchants m
ON m.m_id = p.p_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
GROUP BY m.m_id
ORDER BY p.p_price ASC
如果我在ORDER BY之前添加GROUP BY m.m_id,我会得到16个结果,每个商户1个。我只需要把这个做成最低价。因此,我尝试在prices表(tgmp_prices)中添加一个子查询,如下所示:
SELECT p_id, p_m_id, p_prod_label, a_platform, p_link, p_price, m_title, m_link, m_avg_rating
FROM tgmp_affiliates ga
JOIN tgmp_prices p
ON ga.a_code = p.p_gtin
AND ga.a_code != ''
AND p.p_price = (
SELECT MIN(p.p_price)
FROM tgmp_prices
WHERE p.p_m_id = m.m_id
)
JOIN tgmp_merchants m
ON m.m_id = p.p_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
GROUP BY m.m_id
ORDER BY p.p_price ASC
这并没有给我正确的结果-我认为问题可能是在运行子查询时m.m_id不可用,因此我尝试在子查询中加入merchants表,但仍然得到相同的结果集
DDL如下所示:
CREATE TABLE IF NOT EXISTS `tgmp_affiliates` (
`a_id` int(8) NOT NULL AUTO_INCREMENT,
`site_id` int(6) NOT NULL,
`a_parent` int(8) NOT NULL,
`a_code` varchar(32) NOT NULL,
`a_type` varchar(32) NOT NULL,
`a_platform` varchar(12) NOT NULL,
PRIMARY KEY (`a_id`),
UNIQUE KEY `site_id` (`site_id`,`a_parent`,`a_code`,`a_type`,`a_platform`),
KEY `a_code` (`a_code`),
KEY `a_parent` (`a_parent`),
KEY `a_platform` (`a_platform`),
KEY `a_type` (`a_type`),
KEY `site_id_2` (`site_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
-- --------------------------------------------------------
--
-- Table structure for table `tgmp_merchants`
--
CREATE TABLE IF NOT EXISTS `tgmp_merchants` (
`m_id` int(8) NOT NULL AUTO_INCREMENT,
`site_id` int(6) NOT NULL,
`m_title` varchar(128) NOT NULL,
`m_url` text NOT NULL,
`m_link` varchar(128) NOT NULL,
`m_favicon` text NOT NULL,
`m_avg_rating` tinyint(1) NOT NULL,
`m_hide` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`m_id`),
UNIQUE KEY `m_title` (`m_title`,`m_link`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
-- --------------------------------------------------------
--
-- Table structure for table `tgmp_prices`
--
CREATE TABLE IF NOT EXISTS `tgmp_prices` (
`p_id` int(8) NOT NULL AUTO_INCREMENT,
`site_id` int(6) NOT NULL,
`p_m_id` int(8) NOT NULL,
`p_prod_label` varchar(128) NOT NULL,
`p_gtin` varchar(64) NOT NULL,
`p_parent` int(8) NOT NULL,
`p_link` text NOT NULL,
`p_price` decimal(8,2) NOT NULL,
`p_delivery` decimal(8,2) NOT NULL,
`p_currencey` varchar(10) NOT NULL,
`p_avail` varchar(32) NOT NULL,
`p_condition` varchar(32) NOT NULL,
`p_when` datetime NOT NULL,
`p_type` varchar(32) NOT NULL,
`p_hide` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`p_id`),
UNIQUE KEY `p_gtin` (`p_gtin`,`p_m_id`,`p_price`,`p_delivery`),
KEY `p_price` (`p_price`),
KEY `p_parent` (`p_parent`),
KEY `site_id` (`site_id`),
KEY `p_gtin_2` (`p_gtin`),
KEY `p_type` (`p_type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
我现将质询修订如下:
SELECT p_id, p_m_id, p_prod_label, a_platform, p_link, p_price, m_title, m_link, m_avg_rating
FROM tgmp_affiliates ga
JOIN tgmp_prices p
ON ga.a_code = p.p_gtin
AND ga.a_code != ''
AND p.p_price = (
SELECT MIN(tp.p_price) FROM tgmp_prices tp
WHERE tp.p_m_id = m.m_id
AND tp.p_parent = '25573'
)
JOIN tgmp_merchants m
ON m.m_id = p.p_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
GROUP BY m.m_id
ORDER BY p.p_price ASC
这给出了正确数量的结果,它们非常接近正确的结果集,但我仍然没有得到每个商户的最低价格。您使用子查询作为标准,而不是将其添加为其他记录源。这里有一个调整:
SELECT p_id, p_m_id, p_prod_label, a_platform, p_link, p_price, m_title, m_link, m_avg_rating
FROM tgmp_affiliates ga
JOIN tgmp_prices p
ON ga.a_code = p.p_gtin
AND ga.a_code != ''
JOIN tgmp_merchants m
ON m.m_id = p.p_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
GROUP BY m.m_id
ORDER BY p.p_price ASC
SELECT p_id, p_m_id, p_prod_label, a_platform
, p_link, p_price, m_title, m_link, m_avg_rating, MinPrice
FROM tgmp_affiliates ga
JOIN tgmp_prices p
ON ga.a_code = p.p_gtin
AND ga.a_code != ''
JOIN tgmp_merchants m
ON m.m_id = p.p_m_id
JOIN
(
SELECT tp.p_m_id as lp_m_id, MIN(tp.p_price) AS MinPrice FROM tgmp_prices tp
WHERE tp.p_parent = '25573'
GROUP BY tp.p_m_id
) LowestPriceForEachMerchant
ON m.m_id = LowestPriceForEachMerchant.lp_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
GROUP BY m.m_id
ORDER BY p.p_price ASC
也许吧
SELECT p_id,
p_m_id,
p_prod_label,
a_platform,
p_link,
p_price,
m_title,
m_link,
m_avg_rating
FROM tgmp_affiliates ga
JOIN tgmp_prices p ON ga.a_code = p.p_gtin
AND ga.a_code != ''
JOIN tgmp_merchants m ON m.m_id = p.p_m_id
WHERE ga.site_id = '34'
AND p.site_id = '34'
AND ga.a_parent = '25573'
AND p_type = 'games'
AND m.m_hide = 0
AND p.p_price = (SELECT MIN(p2.p_price)
FROM tgmp_prices p2
WHERE p2.p_m_id = m.m_id)
ORDER BY p.p_price ASC
我认为从tgmp_价格中选择最小值(p.p_价格)的问题,其中p.p_m_id=m.m_id始终与从tgmp_价格中选择最小值(tp.p_价格)给出相同且真实的结果。查看您的查询非常有用,因为它表明您至少已经尝试自己解决了问题。但是为了帮助我们帮助你,你确实应该考虑适当的DDLs(和/或SqLFIDLE),包括所需的和相应的结果集。是否尝试过使用?错误在于别名-子查询使用
p.
,而它应该在p\u price和p\m\u id中使用tgmp\u prices
。正如现在编写的,子查询应该从外部查询返回p\u prices。