【问题标题】:mysql group by having return a setmysql 组通过返回一个集合
【发布时间】:2012-03-13 22:37:27
【问题描述】:

我知道有很多与此相关的类似主题,但我找不到适合我情况的主题。

我正在寻找的是一个 mysql 语句,它允许我按 user_id 分组并返回最大 id 集(id 不是唯一列)。

这是我的数据:

id      url_id  submit_date         engine  status  message
14738   3629    2009-01-02 18:43:55 0pn 10  NULL
14738   3629    2009-01-02 18:43:55 Abacho  10  NULL
14738   3629    2009-01-02 18:43:55 Acoon   10  NULL
14739   3629    2009-01-02 18:43:55 Alexa   10  NULL
14739   3629    2009-01-02 18:43:55 Amfibi  10  NULL
14739   3629    2009-01-02 18:43:55 Burf    10  NULL
14740   4115    2009-01-02 18:43:55 0pn 10  NULL
14740   4115    2009-01-02 18:43:55 Abacho  10  NULL
14740   4115    2009-01-02 18:43:55 Acoon   10  NULL
14741   4115    2009-01-02 18:43:55 Alexa   10  NULL
14741   4115    2009-01-02 18:43:55 Amfibi  10  NULL
14741   4115    2009-01-02 18:43:55 Burf    10  NULL

这是我的sql语句:

SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id);

问题在于该语句仅输出该集合的顶级搜索引擎。我需要该 ID 集中包含的所有搜索引擎。我也不想使用嵌套的 sql 语句,因为它会导致相当大的性能损失。

【问题讨论】:

    标签: mysql group-by having


    【解决方案1】:
    SELECT * FROM table A,
    (SELECT * FROM table WHERE url_id IN (3629,4115) group by url_id having max(id)) B
    WHERE A.id=B.id;
    

    【讨论】:

    • 我知道我提到我不想要嵌套语句,但是这个查询成功了。它在 1.3 秒内将我的结果返回到具有 377K 结果的数据库中。谢谢!
    【解决方案2】:

    既然您提到您希望避免使用子查询和派生表,您应该尝试使用自排除连接。
    说明:通过自连接,我们创建另一个表,与第一个表进行比较以找到最近的id,即每个url_id 没有更大id 值的行。

    SELECT t.* 
      FROM yourtable t 
           LEFT JOIN yourtable t2 
           ON t2.url_id = t.url_id
       AND t2.id > t.id
     WHERE t.url_id IN (3629,4115)
       AND t2.id IS NULL;
    

    返回这个(我在测试 b/c 时省略了最后两列,在这个例子中它们无关紧要):

    14739 3629 2009-01-02 18:43:55 14739 3629 2009-01-02 18:43:55 14739 3629 2009-01-02 18:43:55 布尔夫 14741 4115 2009-01-02 18:43:55 14741 4115 2009-01-02 18:43:55 14741 4115 2009-01-02 18:43:55 布尔夫

    SQLized here。 (似乎不支持自联接,因此同一个表被定义并填充了两次。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-18
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多