A 產品表,model唯一
model def_price brand
001 0.5 wa
002 0.2 qa
003 0.3 wa
B來貨表
model price who date
001 0.4 張三 2017-10-08
001 0.3 張二 2017-9-08
001 0.5 張三 2017-8-08
001 0.6 張三 2017-11-08
002 0.2 李四 2017-5-05
002 0.3 李五 2017-4-06
1:我想得到不重復的記錄,并且這個記錄是最新日期的。或是最低價格的記錄。???
2:我想得到每條最低價格而不重復型號的資料,003來貨表并沒有記錄,就使用默認產品表的價格,其他為null,
我想要輸出的結果:如下:
001 0.3 張二 2017-9-08 wa
002 0.2 李四 2017-5-05 qa
003 0.3 null null wa
select distinct B.model,min(B.price),B.who,B.date from A,B where A.model=B.model;
如果這樣的話,003是不會被列印出來。
select A.model,min(B.price),B.who,B.date from A,B group by A.model;
這樣出來每一列的資料都是獨立的,并不會關聯上。比如最低的價格的記錄的who,date都不是最低價格該記錄的資料。
請教大神們煩惱我很久,百度了很多也不知道怎么寫,在下衷心感謝。
uj5u.com熱心網友回復:
這個問題要深究就比較麻煩,你要得到的是 B來貨表 每個 model 價格最低的最新的一條記錄所以這里有幾個問題:
1. 價格最低
SELECT model, MIN(price) as price FROM B來貨表 GROUP BY model
2. 價格最低要最新日期
SELECT a.model, a.price, MAX(B.date) as date
FROM(
SELECT model, MIN(price) as price FROM B來貨表 GROUP BY model
)a, B來貨表 b
WHERE a.model = b.model
GROUP BY a.model, a.price
3. 最低價格最新日期中,如果仍然有重復的,任意取一個
SELECT aa.model, aa.price, aa.date, ANY_VALUE(bb.who) as who
FROM(
SELECT a.model, a.price, MAX(B.date) as date
FROM(
SELECT model, MIN(price) as price FROM B來貨表 GROUP BY model
)a, B來貨表 b
WHERE a.model = b.model
) aa, B來貨表 bb
WHERE aa.model = bb.model
GROUP BY aa.model, aa.price, aa.date
4. 這個是最終的查詢, 實作需要的資料
SELECT m.model,
IFNULL(data.price, m.def_price) as price,
data.who, data.date, m.brand
FROM(
SELECT aa.model, aa.price, aa.date, ANY_VALUE(bb.who) as who
FROM(
SELECT a.model, a.price, MAX(B.date) as date
FROM(
SELECT model, MIN(price) as price FROM B來貨表 GROUP BY model
)a, B來貨表 b
WHERE a.model = b.model
) aa, B來貨表 bb
WHERE aa.model = bb.model
GROUP BY aa.model, aa.price, aa.date
)data RIGHT JOIN A產品表 m ON m.model = data.model
uj5u.com熱心網友回復:
非常謝謝你兄弟,你的這4個解決方案還是沒有辦法把A 表003給列印出來:
第一個,不查詢A表。
2/3/4 有where a.model = b.model, 那么A表里有003,B表里卻沒有003,沒有辦法把003給打出來,如何根據A表的model,去合并B表的各種條件呢?
能有辦法輸出這樣的結果嗎?
001 0.3 張二 2017-9-08 wa
002 0.2 李四 2017-5-05 qa
003 0.3 null null wa
謝謝
uj5u.com熱心網友回復:
你說 002 的 who, date 沒有寫出,我承認,因為我漏寫了一個 GROUP BY你說沒出來的是 003 , 那就徹底無語了
RIGHT JOIN 是白用的么?
uj5u.com熱心網友回復:
USE tempdb;
DROP TABLE IF EXISTS A產品表, B來貨表;
CREATE TABLE A產品表(
model varchar(10) primary key, def_price decimal(10,1), brand varchar(10) );
INSERT A產品表 VALUES
('001', 0.5, 'wa'),
('002', 0.2, 'qa'),
('003', 0.3, 'wa');
CREATE TABLE B來貨表(
model varchar(10), price decimal(10, 1), who varchar(10), date date);
INSERT B來貨表 VALUES
('001', 0.4, '張三', '2017-10-08'),
('001', 0.3, '張二', '2017-9-08'),
('001', 0.5, '張三', '2017-8-08'),
('001', 0.6, '張三', '2017-11-08'),
('002', 0.2, '李四', '2017-5-05'),
('002', 0.3, '李五', '2017-4-06');
SELECT m.model,
IFNULL(data.price, m.def_price) as price,
data.who, data.date, m.brand
FROM(
SELECT aa.model, aa.price, aa.date, ANY_VALUE(bb.who) as who
FROM(
SELECT a.model, a.price, MAX(B.date) as date
FROM(
SELECT model, MIN(price) as price FROM B來貨表 GROUP BY model
)a, B來貨表 b
WHERE a.model = b.model
GROUP BY a.model, a.price
) aa, B來貨表 bb
WHERE aa.model = bb.model
GROUP BY aa.model, aa.price, aa.date
)data RIGHT JOIN A產品表 m ON m.model = data.model;
自己執行看結果,如果還是沒有出來,那也許你用的不是 myql, 或者是版本不是我用過的那種
uj5u.com熱心網友回復:
SELECT
b.model, MIN(b.price), b.who, MAX(b.date), a.brand
FROM
a_get_product b
LEFT JOIN
a_product a ON a.model = b.model
GROUP BY a.model
UNION ALL SELECT
a.model, a.def_price, NULL who, NULL date, a.brand
FROM
a_product a
WHERE
NOT EXISTS( SELECT
*
FROM
a_get_product b
WHERE
b.model = a.model);
a_get_product:來貨表;a_product:產品表。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/106489.html
標籤:MySQL
