【问题标题】:SQL: How to select rows from a table while ignoring the duplicate field values?SQL:如何在忽略重复字段值的情况下从表中选择行?
【发布时间】:2011-01-13 16:43:29
【问题描述】:

如何在忽略重复字段值的情况下从表中选择行?

这是一个例子:

id          user_id          message

1           Adam             "Adam is here."
2           Peter            "Hi there this is Peter."
3           Peter            "I am getting sick."
4           Josh             "Oh, snap. I'm on a boat!"
5           Tom              "This show is great."
6           Laura            "Textmate rocks."

我想要实现的是从我的数据库中选择最近活跃的用户。假设我想选择 5 个最近活跃的用户。问题是,下面的脚本选择了 Peter 两次。

mysql_query("SELECT * FROM messages ORDER BY id DESC LIMIT 5 ");

我想要的是当它再次到达彼得时跳过该行,并选择下一个结果,在我们的例子中是亚当。所以我不想再次向我的访问者显示最近活跃的用户是 Laura、Tom、Josh、Peter 和 Peter。这没有任何意义,相反,我想以这种方式向他们展示:劳拉、汤姆、乔希、彼得、(跳过彼得)和亚当。

有没有我可以用来解决这个问题的 SQL 命令?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    是的。 “不同”。

     SELECT DISTINCT(user_id) FROM messages ORDER BY id DESC LIMIT 5
    

    【讨论】:

    • 如果他也试图获取消息,这将不起作用。 DISTINCT 根据所有返回的列进行区分。
    • 正确!但从提到名字我会说他想要这些名字。您可以将其添加为完整行的子查询吗?
    • 感谢科里沃德的信息。很高兴知道。如果我也想选择消息怎么办?
    • 是的,这种情况下我只想选择名称,因为我想知道哪些用户最近活跃。谢谢南妮。
    • 但是同时知道如何选择消息会很棒吗?有什么解决办法吗?
    【解决方案2】:

    也许您可以使用GROUP BY 排除重复用户。

    SELECT * FROM messages GROUP BY user_id ORDER BY id DESC LIMIT 5;
    

    【讨论】:

    • grounping 和 distinct 有什么区别?
    • GROUP BY 会将所有行分组到一列。 DISTINCT 将过滤掉所有返回的列都相同的任何行。在大多数情况下,GROUP BY 更快。在这种情况下,这也意味着您可以根据需要在同一查询中提取消息。
    • 分组将合并该字段的所有内容。这意味着您应该在其他字段上使用聚合函数。 AFAIK 对您的情况不是很有用
    • @coreyward 对不起,MySQL sux,在 sybase 中不起作用,而在 mysql 中确实起作用,对此感到抱歉。适合我的 RTFM!
    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多