A 产品表,model唯一
model   def_price    brand
001       0.5              wa
002       0.2              qa
003       0.3              waB来货表
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-061:我想得到不重复的记录,并且这个记录是最新日期的。或是最低价格的记录。???
2:我想得到每条最低价格而不重复型号的数据,003来货表并没有记录,就使用默认产品表的价格,其他为null,
我想要输出的结果:如下:
001        0.3      张二     2017-9-08       wa
002        0.2      李四     2017-5-05       qa
003        0.3       null      null                  waselect 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都不是最低价格该记录的数据。请教大神们烦恼我很久,百度了很多也不知道怎么写,在下衷心感谢。

解决方案 »

  1.   

    这个问题要深究就比较麻烦,你要得到的是 B来货表 每个 model    价格最低的最新的一条记录
    所以这里有几个问题:
    1.  价格最低SELECT model, MIN(price) as price FROM B来货表 GROUP BY model2. 价格最低要最新日期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.price3. 最低价格最新日期中,如果仍然有重复的,任意取一个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.date4. 这个是最终的查询, 实现需要的数据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
      

  2.   


    非常谢谢你兄弟,你的这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谢谢
      

  3.   

    你说 002 的 who, date 没有写出,我承认,因为我漏写了一个 GROUP BY
    你说没出来的是 003 , 那就彻底无语了
    RIGHT JOIN 是白用的么?
      

  4.   

    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, 或者是版本不是我用过的那种
      

  5.   

    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:产品表。