2017-07-23 48 views
0

我有结构...Mysql的需要选择与多个字段没有dublicats比较

CREATE TABLE IF NOT EXISTS `deals` (
    `deal_id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `fromCity` varchar(75) NOT NULL DEFAULT ' ', 
    `toCity` varchar(75) NOT NULL DEFAULT '', 
    `outbound` date NOT NULL, 
    `inbound` date NOT NULL, 
    `airline` varchar(50) NOT NULL, 
    `CPM` decimal(8,2) unsigned NOT NULL, 
    `created` datetime NOT NULL, 
    PRIMARY KEY (`deal_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=719971 ; 


INSERT INTO `deals` (`deal_id`, `fromCity`, `toCity`, `outbound`, `inbound`, `airline`, `CPM`, `created`) VALUES 
(719968, 'Hong Kong', 'Taegu', '2017-07-23', '2017-07-17', 'Air China', '4.80', '2017-07-02 05:48:05'), 
(719967, 'Hong Kong', 'Taegu', '2017-07-23', '2017-07-17', 'Air China', '4.81', '2017-07-02 05:48:04'), 
(719966, 'Hong Kong', 'Montreal', '2017-07-23', '2017-07-18', 'Air China', '4.70', '2017-07-02 05:48:04'), 
(719965, 'Hong Kong', 'Montreal', '2017-07-23', '2017-07-18', 'Air China', '4.75', '2017-07-02 05:48:04'), 
(719964, 'Busan', 'Saipan', '2017-07-23', '2017-07-19', 'Air China', '4.60', '2017-07-02 05:48:04'), 
(719969, 'Hong Kong', 'Taegu', '2017-07-23', '2017-07-17', 'Air China', '4.82', '2017-07-02 05:49:04'), 
(719970, 'Hong Kong', 'Saipan', '2017-07-23', '2017-07-17', 'Jeju Air', '4.85', '2017-07-02 05:49:04'); 

单个表“交易”和7分的记录,我需要选择,没有基于dublicats所有记录记录从城市到城市,出站和入站等几个领域。

所以,我想选择每一行,但如果选定的行有一个dublicats具有相同fromCity,toCity,出站和入站值,我只需要从dublicats中只选择第一个或只有最后一个。

这是我使用获得的所有记录与航空公司=“中国国航”主查询:因为只有六行一直需要航空公司

SELECT 
    SQL_CALC_FOUND_ROWS fromCity, toCity, inbound, outbound, airline, CPM, created 
FROM 
    deals 
WHERE 
    airline LIKE '%Air China%' 
ORDER BY 
    CPM 

该查询返回6行从7。 但是,您可以在结果中看到3个来自城市,城市,入站,出站字段的公共信息。 all records with dublicats and neede airline

我需要从那里只选择3个recors。这是我需要的记录。 Needed rows. First do not have a dublicats. Second have a one dublicat. And third have a two dublicats.

而且我尝试使用这个查询而不dublicats选择...

SELECT 
    minid, deals.deal_id, 
    deals.fromCity, deals.toCity, deals.inbound, deals.outbound, 
    deals.airline, deals.CPM, deals.created 
    FROM 
    deals 
    inner join 
    (select 
     min(deal_id) minid, deal_id, 
     fromCity, toCity, inbound, outbound, airline, CPM, created 
    from deals 
    group by fromCity, toCity, inbound, outbound 
    having count(1) > 1) 
    as duplicates 
    on (duplicates.fromCity = deals.fromCity 
    and duplicates.toCity = deals.toCity 
    and duplicates.inbound = deals.inbound 
    and duplicates.outbound = deals.outbound 
    and duplicates.deal_id <> deals.deal_id) 

    WHERE 
    deals.airline LIKE '%Air China%' 

    ORDER BY 
    CPM 

但此查询只行有一个dublicats返回。此外,如果行没有单个dublicats,它将返回几行而不是dublicats。

期望的结果应该是如下:

+---------+-----------+----------+------------+------------+-----------+------+---------------------+ 
| deal_id | fromCity | toCity | outbound | inbound | airline | CPM | created    | 
+---------+-----------+----------+------------+------------+-----------+------+---------------------+ 
| 719964 | Busan  | Saipan | 2017-07-23 | 2017-07-19 | Air China | 4.60 | 2017-07-02 05:48:04 | 
| 719966 | Hong Kong | Montreal | 2017-07-23 | 2017-07-18 | Air China | 4.70 | 2017-07-02 05:48:04 | 
| 719967 | Hong Kong | Taegu | 2017-07-23 | 2017-07-17 | Air China | 4.81 | 2017-07-02 05:48:04 | 
+---------+-----------+----------+------------+------------+-----------+------+---------------------+ 

谢谢你的帮助。带着敬意。

+0

将所期望的结果是什么样的 – Strawberry

+0

我想你问这个? https://i.stack.imgur.com/rwqwc.png – Yegor

+0

“只有首先还是最后一个”? – Strawberry

回答

0

例如为:

SELECT a.* 
    FROM deals a 
    JOIN 
    (SELECT MAX(deal_id) deal_id 
     FROM deals x 
     JOIN 
      (SELECT fromcity 
        , tocity 
        , outbound 
        , inbound 
        , MIN(created) created 
       FROM deals 
       WHERE airline = 'Air China' 
       GROUP 
        BY fromcity 
        , tocity 
        , outbound 
        , inbound 
      ) y 
      ON y.fromcity = x.fromcity 
      AND y.tocity = x.tocity 
      AND y.outbound = x.outbound 
      AND y.inbound = x.inbound 
      AND y.created = x.created 
     GROUP 
      BY x.fromcity 
      , x.tocity 
      , x.outbound 
      , x.inbound 
      , x.airline 
      , x.created 
    ) b 
    ON b.deal_id = a.deal_id; 
+0

最高ID会很棒。 – Yegor

+0

如何将mysql数据粘贴到漂亮的字符块中? – Yegor

+0

我通过缩进文本至少4个空格来完成此操作。 – Strawberry

-1

试试这个

SELECT 
    fromCity, 
    toCity, 
    inbound, 
    outbound, 
    airline, 
    CPM, 
    created 
FROM 
    deals 
WHERE 
    airline LIKE '%Air China%' 
    AND created = 
    (
      SELECT 
       created 
      FROM deals 
      GROUP BY fromCity, toCity, inbound, outbound, airline 
      ORDER BY created, CPM ASC 
      LIMIT 1 
    ) 
GROUP BY fromCity, toCity, inbound, outbound, airline, created ; 

随着加入

SELECT 
    d.fromCity, d.toCity, d.inbound, d.outbound, d.airline, d.CPM, d.created 
FROM 
    deals d 
INNER JOIN 
(
    SELECT 
    created 
    FROM deals 
    GROUP BY fromCity, toCity, inbound, outbound, airline 
    LIMIT 1 
) as T1 
ON (T1.created = d.created AND d.airline LIKE '%Air China%') 
GROUP BY d.fromCity, d.toCity, d.inbound, d.outbound, d.airline, d.created; 
+0

会尝试进行一些测试,但首先看它是工作辉煌。谢谢。我会尽快通知您结果。 – Yegor

+0

抱歉,每千次展示费用字段可能不同,在这种情况下查询工作不正确。 尝试更改每千次展示费用并再次运行.. – Yegor

+0

如果您给我一个示例数据和示例结果,我可以编辑此@Yegor –