【问题标题】:Retrieving the 25 most recently added entries from all tables in a MySQL database从 MySQL 数据库中的所有表中检索 25 个最近添加的条目
【发布时间】:2009-10-31 00:01:22
【问题描述】:

我有一个 MySQL 数据库(名为“sitefeather”),它最终会有几个具有相同结构的表。结构是这样的:

id INT(11) NOT NULL auto_increment, site VARCHAR(1000) NOT NULL, action1 BIGINT(9) NOT NULL, action2 BIGINT(9) NOT NULL, createddatetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY(id), UNIQUE (site)

我想打印所有表中最近添加的 25 个条目(在每个表中称为“站点”)的列表。我怎样才能用 PHP 做到这一点?

提前致谢,

约翰

编辑:我将如何为许多可变的表执行此操作?

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    你会想要做一些类似的事情:

    (
        select 't' as table_name, id, createdatetime 
        from t 
        order by createdatetime desc 
        limit 25
    )
    union
    (
        select 'u' as table_name, id, createdatetime 
        from u 
        order by createdatetime desc 
        limit 25
    )
    union
    (
        select 'v' as table_name, id, createdatetime 
        from v 
        order by createdatetime desc 
        limit 25
    )
    order by createdatetime desc
    limit 25
    

    这应该保证您在各个表的createdatetime 字段上拥有的任何索引的好处,并允许您确定从哪个表中选择了 25 个结果 ID。

    【讨论】:

    • 赞成这个而不是 gahooa 的,因为它更加优化(每桌限制 25 个)
    • 我如何为可变数量的表执行此操作?
    • 您向联合中添加更多查询;复制并粘贴块union ( ... ) 并更改表名和表名的字符串文字。
    • 这不适用于可变数量的表格......数量通常应该增加。每次将表添加到数据库时,我都无法更改代码。
    • 您不能编写一个查询来选择表的名称从这些表中查询;这将涉及从字符串文字到标识符的转换,这是 MySQL 不允许的。最接近您想要的方法是查询 information_schema.tables 以获取您要使用的表,然后使用该表列表动态构建您的查询。
    【解决方案2】:

    来自http://dev.mysql.com/doc/refman/5.0/en/union.html

    (SELECT id FROM table1)
      UNION ALL
    (SELECT id FROM table2)
      UNION ALL
    (SELECT id FROM table3)
      UNION ALL
    (SELECT id FROM tableN)
      ORDER BY createdatetime DESC 
      LIMIT 25
    

    您将真的想在这里查看索引以进行优化...

    【讨论】:

      【解决方案3】:

      如果您要这样做,或者出于其他原因一次查询所有表,您可能需要set up a MERGE table,以便更轻松地访问组合数据。

      CREATE TABLE merged_table (
          id INT(11) NOT NULL auto_increment,
          site VARCHAR(1000) NOT NULL,
          action1 BIGINT(9) NOT NULL,
          action2 BIGINT(9) NOT NULL,
          createddatetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
          PRIMARY KEY(id),
          UNIQUE (site)) ENGINE=MERGE UNION=(table1,table2,table3,tableN) INSERT_METHOD=LAST;
      

      但是,这种方法只有在您每次都查询相同的表时才有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-21
        • 2015-01-19
        • 2012-05-16
        • 2013-07-18
        • 1970-01-01
        • 2014-04-10
        • 2013-03-20
        相关资源
        最近更新 更多