【问题标题】:Select and join on dynamic table name选择并加入动态表名
【发布时间】:2012-06-22 16:51:14
【问题描述】:

我想获取有关每个item 的所有信息。 Items 有全局变量(这里是on_stock),但每个项目在不同的表中也有自己的属性,并且该表的名称与项目类型名称相同。

  1. 选择项目
  2. 在类型表 id 上加入其 type_id -> name
  3. name.id 上加入所选项目

示例如下:

[items]
 id  | on_stock |  type_id
-----+----------+-----------
  1       1        1(=car)
  2       0        1(=car)
  3       1        2(=ship)
  4       0        2(=ship)

[types]
 id |  name
----+--------
  1     car
  2    ship

[car]
 id | top_speed
----+-----------
 1       200
 2       300

[ship]
 id  | color
-----+-------
 3     red
 4     blue

预期结果:

1 on_stock=1 top_speed=200
2 on_stock=0 top_speed=300
3 on_stock=1 color=red
4 on_stock=0 color=blue

请帮助实现这一目标!

【问题讨论】:

  • 这就是为什么这不是一个很好的数据库设计。我建议你重新设计你的桌子。这只是该设计给您带来的众多麻烦中的第一个。
  • @JohnFx 这是重新设计的。你能告诉我你会如何重新设计这个吗?
  • @JohnFx 如果我将类型名称存储在 items 表中会更容易,我知道,但这样更优雅,不是吗?
  • 需要更多的重新设计。数据库的代码异味是 A)您需要在查询中使用动态表名来完成工作;或 B) 当您有新数据要添加时,您需要修改数据库结构。让我模拟一个更好的快速设计,它会更好地为您服务。一秒。

标签: mysql select join


【解决方案1】:

它不漂亮,但数据结构也不漂亮。这是一个查询来做你想做的事

SELECT I.id, I.On_stock, C.top_speed,S.Color
FROM ITEMS I
LEFT JOIN Car C ON (I.ID = C.CarID)
LEFT JOIN Ship S ON (I.ID = S.ShipID)

每次添加新项目类型时都必须调整查询,但这只是这种数据结构的缺点。

【讨论】:

    【解决方案2】:

    如果我不能在一个请求中完成,我会在更多(1+项目类型计数)中完成。

    首先,我需要所需的类型为数组(id=>name):

    $req_types = array();
        $rs = mysql_query("
            SELECT items.type_id,types.name
            FROM items 
            JOIN types ON items.type_id=type.id 
            GROUP BY items.type_id
            ");
        while($type= mysql_fetch_assoc($rs))
            $req_types[$type['id']] = $type['name'];
    

    那么我需要通用和单独的项目数据:

    $groups = array();     
    foreach($req_types as $table)
            {
                $rs = mysql_query("
                        SELECT items.*,$table.*
                        FROM items 
                        JOIN $table ON $table.id=items.id
                        ");
                while($item = mysql_fetch_assoc($rs))
                    $groups[$table][] = $item;
            }
    

    【讨论】:

      猜你喜欢
      • 2011-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      相关资源
      最近更新 更多