MySQL - 根据两列的重复从Select中排除行

时间:2011-01-07 18:47:18

标签: mysql sql

我试图根据返回数据集中多个列的条件匹配来缩小现有复杂查询的结果。我将尝试尽可能地简化数据。

假设下面的表结构表示我现有的复杂查询已选择的数据(此处按date排序):

+----+-----------+------+------------+
| id | remote_id | type | date       |
+----+-----------+------+------------+
|  1 |         1 | A    | 2011-01-01 |
|  3 |         1 | A    | 2011-01-07 |
|  5 |         1 | B    | 2011-01-07 |
|  4 |         1 | A    | 2011-05-01 |
+----+-----------+------+------------+

我需要根据以下标准从该数据集中进行选择:

  • 如果remote_idtype的配对对于该集唯一,则始终返回该行
  • 如果remote_idtype的配对对该集唯一,请执行以下操作:
    • remote_idtype配对的行集不是唯一的,只返回 date的单行>最大,现在小于或等于

所以,如果今天是2011-01-10,我希望返回的数据集为:

+----+-----------+------+------------+
| id | remote_id | type | date       |
+----+-----------+------+------------+
|  3 |         1 | A    | 2011-01-07 |
|  5 |         1 | B    | 2011-01-07 |
+----+-----------+------+------------+

出于某种原因,我没有运气缠绕这个。我怀疑答案在于group by的良好应用,但我无法理解。非常感谢任何帮助!

5 个答案:

答案 0 :(得分:4)

/* Rows with exactly one date - always return regardless of when date occurs */
SELECT id, remote_id, type, date
    FROM YourTable
    GROUP BY remote_id, type
    HAVING COUNT(*) = 1
UNION
/* Rows with more than one date - Return Max date <= NOW */
SELECT yt.id, yt.remote_id, yt.type, yt.date
    FROM YourTable yt
        INNER JOIN (SELECT remote_id, type, max(date) as maxdate
                        FROM YourTable
                        WHERE date <= DATE(NOW())
                        GROUP BY remote_id, type
                        HAVING COUNT(*) > 1) sq
             ON yt.remote_id = sq.remote_id
                 AND yt.type = sq.type
                 AND yt.date = sq.maxdate

答案 1 :(得分:1)

group by子句将具有相同一列或多列值的所有行组合在一起,并在结果集中为它们返回一行。如果您使用将应用于每个“组”的聚合函数(min,max,sum,avg等)。

SELECT id, remote_id, type, max(date) 
FROM blah 
GROUP BY remote_id, date;

我不是今天的日期所在的妓女,但我认为这是你没有描述的复杂查询的一部分,我认为这与你的问题没有直接关系。

答案 2 :(得分:1)

试试这个:

SELECT a.*
  FROM table a INNER JOIN 
             (
                select remote_id, type, MAX(date) date, COUNT(1) cnt from table
                 group by remote_id, type
             ) b
 WHERE a.remote_id = b.remote_id, 
                 AND a.type = b.type
                 AND a.date = b.date
                 AND ( (b.cnt = 1) OR (b.cnt>1 AND b.date <= DATE(NOW())))

答案 3 :(得分:0)

试试这个

select id, remote_id, type, MAX(date) from table
group by remote_id, type

答案 4 :(得分:0)

嘿卡森!您可以尝试在这两个字段上使用“distinct”关键字,并且在联合中,您可以使用Count()以及group by和some运算符来提取非唯一(最大且小于今天)的记录!