MySQL查询:从有序列表中删除重复项

时间:2012-03-12 07:15:19

标签: mysql sql duplicate-removal

我的表名为items。它包含item_idsource列以及其他一些列。

我想按item_id排序选择,但我也希望结果的source列中没有任何重复项。

此查询有什么问题?

SELECT *
FROM items
WHERE item_section='sp_500'
ORDER BY item_id DESC
GROUP BY source
LIMIT 3

7 个答案:

答案 0 :(得分:4)

应该像这样工作:

SELECT *
FROM   items
JOIN  (
    SELECT max(item_id) AS item_id
    FROM   items
    WHERE  item_section = 'sp_500'
    GROUP  BY source
    ORDER  BY 1 DESC
    LIMIT  3
    ) i USING (item_id)

为什么?

1)按item_section = 'sp_500'

过滤

2)折叠source中具有相同GROUP BY的多个项目,因为:

  

源列中没有任何重复项

我选择最item_idsource - 似乎最合理,你没有说明。

3)ORDER BY item_id DESC获得最大的和LIMIT 3(现在没有欺骗)。

4)JOIN到原始表格以获取所选item_id的整行。

答案 1 :(得分:1)

首先,当您拥有*子句时,无法选择所有GROUP BY。您可以在查询中选择source以及其他一些功能,例如count(*) 其次,您无法按item_id订购。您可以按source和其他一些功能订购。
第三,order by应该在group by之后

答案 2 :(得分:1)

第一件事是order by item_id追踪group by。共同规则:分组...... HAVinG ...按...排序。

答案 3 :(得分:0)

将其更改为: -

SELECT DISTINCT fieldnames FROM items WHERE item_section='sp_500' GROUP BY source ORDER BY item_id DESC LIMIT 3

在DISTINCT中,您必须指定字段名称。

答案 4 :(得分:0)

您无法合并select *group by 如果您只需要选择唯一的行,请使用

SELECT DISTINCT item_id, source 
FROM items  
WHERE item_section='sp_500'  
ORDER BY item_id DESC`   

答案 5 :(得分:0)

使用此

SELECT * FROM items 
WHERE item_section='sp_500'  
GROUP BY source 
ORDER BY item_id DESC LIMIT 3

Gudluck !!

答案 6 :(得分:0)

更改查询

SELECT *
FROM items
WHERE item_section='sp_500'
GROUP BY source
ORDER BY item_id DESC
LIMIT 3

如果没有结果,那么尝试删除where子句或更改item_section的值,你可能没有得到这个item_section的输出

希望这会有所帮助