我试图根据返回数据集中多个列的条件匹配来缩小现有复杂查询的结果。我将尝试尽可能地简化数据。
假设下面的表结构表示我现有的复杂查询已选择的数据(此处按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_id
和type
的配对对于该集唯一,则始终返回该行remote_id
和type
的配对不对该集唯一,请执行以下操作:
remote_id
和type
配对的行集不是唯一的,只返回 date
为的单行>最大,现在小于或等于。所以,如果今天是2011-01-10
,我希望返回的数据集为:
+----+-----------+------+------------+
| id | remote_id | type | date |
+----+-----------+------+------------+
| 3 | 1 | A | 2011-01-07 |
| 5 | 1 | B | 2011-01-07 |
+----+-----------+------+------------+
出于某种原因,我没有运气缠绕这个。我怀疑答案在于group by
的良好应用,但我无法理解。非常感谢任何帮助!
答案 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)