【问题标题】:Does PHP+MySQL support this style of dummy table join?PHP+MySQL 是否支持这种类型的虚拟表连接?
【发布时间】:2012-07-18 17:54:17
【问题描述】:

我使用一种专有的服务器端语言,它位于 Oracle 数据库之上。使用这种语言,您可以使用虚拟表来获取填充了数据的现有记录结构,并在连接到该记录结构上运行查询,就好像它是一个表一样。

这是一个简单的例子:

    //DECLARE THE RECORD STRUCTURE
    record data_out (
        1 prsnl [*]
            2 person_id = f8
            2 full_name = vc
            2 position = vc
            2 status = vc
            2 last_access_dt_tm = vc
            2 role [*]
                3 role_name = vc
                3 role_id = f8  
    ) with persistscript

    //QUERY PEOPLE
    select into "NL:"
    from person p
    where p.whatever_field = "QUALIFIER"
    detail

        a = a + 1
        stat = alterlist(data_out->prsnl, a)

        data_out->prsnl[a]->person_id = p.person_id
        data_out->prsnl[a]->full_name = p.name_full_formatted
        data_out->prsnl[a]->position = p.position

    with time=10

    //USE A DUMMY TABLE TO PULL IN MORE DATA FOR EACH PERSON
    select into "NL:"
    from (dumt d with seq = size(data_out->prsnl,5))
        ,rnd_role_def rrd
        ,rnd_r_assign_hx rah
    plan d
    join rah
        where rah.team_id = data_in->team_id
        and rah.prsnl_id = data_out->prsnl[d.seq]->person_id
        and rah.handoff_dt_tm > cnvtdatetime(curdate-90,curtime)
    join rrd
        where rrd.role_id = rah.role_id
    order by d.seq, rrd.role_name
    head d.seq
        i = 0
    head rrd.role_name
        i = i + 1
        stat = altlist(data_out->prsnl[d.seq]->role, i)

        data_out->prsnl[d.seq]->role[i]->role_id = rrd.role_id
        data_out->prsnl[d.seq]->role[i]->role_name = rrd.role_name

    with time=10

PHP+MySQL 有这样的东西吗?如果是这样,可以以某种方式将我指向包含更多信息或操作方法的链接。谷歌搜索没有为我找到任何东西——可能是搜索错误的关键字。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    使用临时表:

    CREATE TEMPORARY TABLE temp1
    

    临时表将在当前会话中持续存在。您可以通过普通的CREATE TABLE 语法定义临时表的字段:

    CREATE TEMPORARY TABLE temp1(
        `id` INT(11) NOT NULL AUTO_INCREMENT,
        `name` VARCHAR(50),
    )
    

    ...或者您可以创建一个临时表并允许查询数据定义列:

    CREATE TEMPORARY TABLE temp1;
    INSERT INTO temp1
      SELECT id, name FROM normal_table
    

    文档

    【讨论】:

      【解决方案2】:

      可能有用的三件事:

      1. Memory tables (CREATE TABLE mem_t (id (int)) ENGINE=MEMORY;)
      2. 临时表 (CREATE TEMPORARY TABLE temp_t (id (int));)
      3. Views

      请注意,临时表仅对当前连接可见,而视图和内存表是共享资源(如常规表)。

      还可以查看关于 SO 的这些相关问题:

      【讨论】:

        【解决方案3】:

        您可以使用 temporary tablesINSERT SELECT 语法来实现它,然后删除表格 - 但是它不会是最好的性能

        【讨论】:

        • 正确使用临时表不会影响性能。如果你在每个请求中都跑来跑去制作临时表,那当然。但是,如果使用得当,临时表可以提高性能。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-22
        • 2012-06-30
        • 1970-01-01
        • 2017-09-30
        • 1970-01-01
        • 2013-09-08
        • 2011-03-01
        相关资源
        最近更新 更多