2016-11-16 46 views
0

我想加入这些表(task_id with post_id),它将返回您在下面看到的所有内容。这很好,但我想接下来要做的是在保留具有最高版本的项目的同时删除task_id的重复项。获得列x的MAX,同时在列y上获得DISTINCT

我有一个2个表,以便:

项目

ID title task_id project_id  version 
1 "Test"  123   456   1 
2 "Test 2"  124   456   1 
3 "Test 3"  125   456   1 
4 "X 3.1"  125   456   1.1 
5 "X 3.2"  125   456   1.2 

任务

ID post_id meta_key meta_value 
1  123 _completed  0 
4  124 _completed  0 
5  125 _completed  0 

,我有这样的SQL语句至今:

SELECT * 
FROM items t0 
INNER JOIN tasks AS t1 
ON t0.task_id = t1.post_id 
WHERE t1.meta_key = '_completed' 
AND project_id = 456 

返回:

ID title task_id project_id version ID post_id meta_key meta_value 
1 "Test"  123   456   1  1  123 _completed  0 
2 "Test 2"  124   456   1  1  124 _completed  0 
3 "Test 3"  125   456   1  1  125 _completed  0 
4 "X 3.1"  125   456   1.1  1  125 _completed  0 
5 "X 3.2"  125   456   1.2  1  125 _completed  0 

如何删除重复的TASK_ID的,但保持的最高版本,因此该表将是:

ID title task_id project_id version ID post_id meta_key meta_value 
1 "Test"  123   456   1  1  123 _completed  0 
2 "Test 2"  124   456   1  1  124 _completed  0 
5 "X 3.2"  125   456   1.2  1  125 _completed  0 

基本上我最近下令他们BY版本和使用GROUP BY TASK_ID但显然SQL做不让你这样做。

任何人都可以想出一个很好的方法来实现这一目标吗?

+0

这个问题是问及SO无休止地回答。少数这些答案是正确的。此外,本手册还深入讨论了该主题。也就是说,如果你还在挣扎,请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-tobe -a-very-simple-sql-query – Strawberry

+0

尝试在SELECT语句中使用'MAX(version)',并在'GROUP BY'子句中使用'task_id'。 – Viki888

回答

0

根据相关文章,我认为这应该工作。

SELECT * 
FROM items t0 
INNER JOIN tasks AS t1 ON t0.task_id = t1.post_id 
INNER JOIN 
    (SELECT task_id, MAX(version) AS MaxVersion 
    FROM items 
    GROUP BY task_id) groupedt0 
ON t0.task_id = groupedt0.task_id 
AND t0.version = groupedt0.MaxVersion 
AND project_id = 456 
AND t1.meta_key = '_completed' 
ORDER BY ID ASC 

参见:How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

+0

完美的作品。谢谢!对不起,没有想到搜索会很容易找到它。此外,我现在在SQL上很平均。 – SamohtVII