2012-06-20 2 views
1

Я хотел бы получить всю информацию о каждом item. Элементы имеют глобальную переменную (здесь on_stock), но каждый элемент имеет также собственное свойство в другой таблице, и эта таблица имеет то же имя, что и имя типа элементов.Выберите и присоединитесь к имени динамической таблицы

  1. выберите пункты
  2. присоединиться к его 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 

Пожалуйста, помогите достичь этого!

+0

Именно поэтому это не очень хороший дизайн базы данных. Я бы предложил вам перепроектировать ваши таблицы. Это только первая из многих головных болей, которые этот дизайн даст вам. – JohnFx

+0

@JohnFx Это измененный. Не могли бы вы показать мне, как бы вы переделали это? –

+0

@JohnFx Если бы я сохранил имя типа в таблице элементов, чтобы это стало проще, я знаю, но этот способ более изящный, не так ли? –

ответ

0

Если я не смог сделать это по одному запросу, я сделаю это более (количество экземпляров 1 + единиц).

первым, мне нужно требуемые типы как массив (ID => имя):

$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; 
     } 
0

Это не очень, но ни одна из них не является структурой данных. Вот запрос, чтобы сделать то, что вы хотите

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) 

Вы должны будете настроить в запросе каждый раз, когда вы добавляете новый тип элемента, но это всего лишь обратная сторона этой структуры данных.

Смежные вопросы