MySQL选择不同的记录

34

我正在尝试在mysql表中选择重复的行,它对我来说运行正常,但问题是它不让我在查询中选择所有的字段,只允许我选择作为distinct的字段名称,让我写出更好的理解查询

mysql_query("SELECT DISTINCT ticket_id FROM temp_tickets ORDER BY ticket_id")

mysql_query("SELECT * , DISTINCT ticket_id FROM temp_tickets ORDER BY ticket_id")

第一个很好用。

现在当我尝试选择所有字段时,我遇到了错误。

我正在尝试选择重复项中的最新项,例如票证编号127在行ID 7、8、9上出现3次,因此我希望只选择其中一次,并选择最新的条目,即在本例中为9,这适用于其余的所有ticket_id。

有什么想法吗?谢谢。


2
第二个查询是错误的。请解释您要解决的任务是什么。 - zerkms
你还想返回哪些字段?如果某个“ticket_id”有多个值,那么应该怎么处理? - Martin Smith
假设票号127在行ID 7、8、9上连续出现3次,因此我希望选择最新的一次,即在这种情况下为9,并且这适用于所有其他票号...现在有什么想法吗? - Shanon
你可以在这里的答案中使用其中一种技术:https://dev59.com/enI-5IYBdhLWcg3wW3Cp - Martin Smith
2
按照最大N个组的标签进行跟踪。你在评论中提出的问题已经在Stack Overflow上被回答了数十次。 - Bill Karwin
5个回答

78

DISTINCT不是仅适用于某些列的函数,而是一个查询修改器,适用于select-list中的所有列。

也就是说,如果所有列与另一行的列相同,则DISTINCT仅减少行。

DISTINCT必须紧跟在SELECT之后(连同其他查询修饰符,如SQL_CALC_FOUND_ROWS)。然后,在查询修饰符之后,您可以列出要查询的列。

  • 正确: SELECT DISTINCT foo, ticket_id FROM table...

    对于ticket_id foo之间的每个不同值配对输出一行。

  • 错误: SELECT foo, DISTINCT ticket_id FROM table...

    如果ticket_id有三个不同的值,那么这会返回仅三行吗?如果foo有六个不同的值怎么办?应该输出其中的三个值还是另外三个值?
    写法不明确。


44

你是否正在寻找 "SELECT * FROM temp_tickets GROUP BY ticket_id ORDER BY ticket_id

更新:

SELECT t.* 
FROM 
(SELECT ticket_id, MAX(id) as id FROM temp_tickets GROUP BY ticket_id) a  
INNER JOIN temp_tickets t ON (t.id = a.id)

这个代码可以工作,但我想选择重复记录中的最新记录。比如说,ticket_id 127 在行id 7、8、9上出现了3次,所以我想只选择一次,并选择最新的记录,即在这种情况下是9,这适用于所有其他的ticket_id...你有什么想法吗? - Shanon

9

您可以使用group by代替distinct。因为当您使用distinct时,从表中选择所有值会很困难。与使用group by不同的是,您可以获得独特的值以及表中的所有字段。


3
你可以这样使用DISTINCT
mysql_query("SELECT DISTINCT(ticket_id), column1, column2, column3 
FROM temp_tickets 
ORDER BY ticket_id");

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接