SQL - 多个 SELECT 和 GROUP BY 以获得 table 的 MIN(值)
SQL - multi SELECT and GROUP BY to get MIN(value) of table
我正在做一个价格比较网站。
我有以下 table:
table item_price:
|| Set_id ||store_id ||currency_id ||set_price ||
|| 5252 || 1 || 1 || 499.99 ||
|| 5252 || 2 || 1 || 480 ||
|| 5252 || 3 || 1 || 489 ||
|| 5252 || 4 || 2 || 450 ||
|| 5252 || 5 || 2 || 445 ||
|| 5252 || 6 || 2 || 470 ||
|| 5253 || 1 || 1 || 389.99 ||
|| 5253 || 2 || 1 || 392 ||
|| 5253 || 3 || 1 || 400 ||
|| 5253 || 4 || 2 || 360 ||
|| 5253 || 5 || 2 || 370 ||
|| 5253 || 6 || 2 || 380 ||
和set_currency
||currency_id||currency_name||conversion_rate||
|| 1 || EUR || 1 ||
|| 1 || GBP || 0.9 ||
我的目标是获得一个查询,按以下格式返回每种货币的最便宜价格
|| Set_id || store_id || Min_price_eur || Min_price_gbp_in_eur ||
|| 5252 || 5 || 480 || 400.5 ||
|| 5253 || 4 || 389.99 || 324 ||
到目前为止,我只完成了一半的目标:
|| Set_id || store_id || Min_price_eur ||
|| 5252 || 1 || 480 ||
|| 5253 || 1 || 392 ||
使用以下请求:
SELECT
set_id,
min(set_price) AS Min_price_eur,
FROM `item_price`
WHERE currency_id=1
GROUP BY set_id
为了创建最后一列,我厌倦了很多事情,例如:
SELECT
set_id,
min(set_price) AS Min_price_eur,
(SELECT MIN(set_price) FROM 'item_price' WHERE currency_id=2) * (SELECT conversion_rate FROM set_currency WHERE currency_id = 2) AS Min_price_gbp_in_eur
FROM `item_price`
WHERE currency_id=1
GROUP BY set_id
但我做不到。
如果有人能给我一些帮助,我将不胜感激。
谢谢
ps:
这是创建 tables:
的代码
商品价格:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE `item_price` (
`set_id` int(10) UNSIGNED NOT NULL,
`store_id` int(10) UNSIGNED NOT NULL,
`currency_id` int(10) UNSIGNED NOT NULL,
`set_price` float UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `item_price` (`set_id`, `store_id`, `currency_id`, `set_price`) VALUES
(5252, 1, 1, 499.99),
(5252, 2, 1, 480),
(5252, 3, 1, 489),
(5252, 4, 2, 450),
(5252, 5, 2, 445),
(5252, 6, 2, 470),
(5253, 1, 1, 389.55),
(5253, 2, 1, 392),
(5253, 3, 1, 400),
(5253, 4, 2, 360),
(5253, 5, 2, 370),
(5253, 6, 2, 380);
ALTER TABLE `item_price`
ADD PRIMARY KEY (`set_id`,`store_id`) USING BTREE,
ADD KEY `store_id` (`store_id`),
ADD KEY `currency_id` (`currency_id`);
COMMIT;
和
货币:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE `set_currency` (
`currency_id` int(10) UNSIGNED NOT NULL,
`currency_name` char(3) NOT NULL,
`conversion_rate` float UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `set_currency` (`currency_id`, `currency_name`, `conversion_rate`) VALUES
(1, 'EUR', 1),
(2, 'GBP', 0.9);
ALTER TABLE `set_currency`
ADD PRIMARY KEY (`currency_id`);
COMMIT;
这个问题对我来说看起来像是一些算术聚合:
select ip.set_id, ip.store_id,
min(case when currency_name = 'EUR' then ip.set_price end) as min_price_eur,
min(case when currency_name = 'GBP' then ip.set_price / c.conversion_rate end) as min_gpbprice_eur
from item_price ip left join
set_currency c
on ip.currency_id = c.currency_id
group by ip.set_id, ip.store_id
我正在做一个价格比较网站。
我有以下 table: table item_price:
|| Set_id ||store_id ||currency_id ||set_price ||
|| 5252 || 1 || 1 || 499.99 ||
|| 5252 || 2 || 1 || 480 ||
|| 5252 || 3 || 1 || 489 ||
|| 5252 || 4 || 2 || 450 ||
|| 5252 || 5 || 2 || 445 ||
|| 5252 || 6 || 2 || 470 ||
|| 5253 || 1 || 1 || 389.99 ||
|| 5253 || 2 || 1 || 392 ||
|| 5253 || 3 || 1 || 400 ||
|| 5253 || 4 || 2 || 360 ||
|| 5253 || 5 || 2 || 370 ||
|| 5253 || 6 || 2 || 380 ||
和set_currency
||currency_id||currency_name||conversion_rate||
|| 1 || EUR || 1 ||
|| 1 || GBP || 0.9 ||
我的目标是获得一个查询,按以下格式返回每种货币的最便宜价格
|| Set_id || store_id || Min_price_eur || Min_price_gbp_in_eur ||
|| 5252 || 5 || 480 || 400.5 ||
|| 5253 || 4 || 389.99 || 324 ||
到目前为止,我只完成了一半的目标:
|| Set_id || store_id || Min_price_eur ||
|| 5252 || 1 || 480 ||
|| 5253 || 1 || 392 ||
使用以下请求:
SELECT
set_id,
min(set_price) AS Min_price_eur,
FROM `item_price`
WHERE currency_id=1
GROUP BY set_id
为了创建最后一列,我厌倦了很多事情,例如:
SELECT
set_id,
min(set_price) AS Min_price_eur,
(SELECT MIN(set_price) FROM 'item_price' WHERE currency_id=2) * (SELECT conversion_rate FROM set_currency WHERE currency_id = 2) AS Min_price_gbp_in_eur
FROM `item_price`
WHERE currency_id=1
GROUP BY set_id
但我做不到。 如果有人能给我一些帮助,我将不胜感激。
谢谢
ps: 这是创建 tables:
的代码商品价格:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE `item_price` (
`set_id` int(10) UNSIGNED NOT NULL,
`store_id` int(10) UNSIGNED NOT NULL,
`currency_id` int(10) UNSIGNED NOT NULL,
`set_price` float UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `item_price` (`set_id`, `store_id`, `currency_id`, `set_price`) VALUES
(5252, 1, 1, 499.99),
(5252, 2, 1, 480),
(5252, 3, 1, 489),
(5252, 4, 2, 450),
(5252, 5, 2, 445),
(5252, 6, 2, 470),
(5253, 1, 1, 389.55),
(5253, 2, 1, 392),
(5253, 3, 1, 400),
(5253, 4, 2, 360),
(5253, 5, 2, 370),
(5253, 6, 2, 380);
ALTER TABLE `item_price`
ADD PRIMARY KEY (`set_id`,`store_id`) USING BTREE,
ADD KEY `store_id` (`store_id`),
ADD KEY `currency_id` (`currency_id`);
COMMIT;
和 货币:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
CREATE TABLE `set_currency` (
`currency_id` int(10) UNSIGNED NOT NULL,
`currency_name` char(3) NOT NULL,
`conversion_rate` float UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `set_currency` (`currency_id`, `currency_name`, `conversion_rate`) VALUES
(1, 'EUR', 1),
(2, 'GBP', 0.9);
ALTER TABLE `set_currency`
ADD PRIMARY KEY (`currency_id`);
COMMIT;
这个问题对我来说看起来像是一些算术聚合:
select ip.set_id, ip.store_id,
min(case when currency_name = 'EUR' then ip.set_price end) as min_price_eur,
min(case when currency_name = 'GBP' then ip.set_price / c.conversion_rate end) as min_gpbprice_eur
from item_price ip left join
set_currency c
on ip.currency_id = c.currency_id
group by ip.set_id, ip.store_id