2014-02-23 81 views
0

這是我的DB返回XML參數

table name: table_item 
id 
name 
param 

在參數費爾德有一些「XML參數」,例如數據:

{"model":"large","color":"red","number":"1000",} 

我可以通過這個代碼返回名稱:

select id,name FROM table_item 

,並在PHP打印這樣

foreach($rows as $row) 
$name= $row->name; 

現在該如何返回參數? 比如我想有這樣的事情

foreach($rows as $row) 
{ 
    $model= $row->param->model; 
    $color= $row->param->color; 
} 

我使用PHP/MySQL的。

或某事這樣的:

select id,name FROM table_item 
where param->color="red" or param->color="yellow" 
+0

你必須用你的foreach循環解析它。 – Alexander

+0

沒有任何方法嗎?因爲例如我wana選擇那些顏色=紅色的文章 – user3307827

+0

就是這樣嗎?只需按顏色選擇? – Alexander

回答

0

創建一個名稱/值對一個額外的表和原來的表它item_id

table: param 
id p_name value item_id 
--------------------------------- 
1 model large 1 
2 color red  1 
3 number 1000  1 

變化鏈接到您的第一個表:

table: item 
id name 
------------------------ 
1 round neck cotton t-shirt 

那麼你可以:

SELECT item.id, item.name, param.p_name, param.value FROM item 
LEFT JOIN param ON item.id = item_id 
WHERE param.p_name = 'color' AND param.value = 'red'; 

結果:

id name      p_name value 
------------------------------------------------- 
1 round neck cotton t-shirt color red 

看到它的工作:http://sqlfiddle.com/#!2/07ab2/1

+0

這可以做得更容易。看到我的回答在 – Alexander

+0

@亞歷山大:我明白了。不過,我認爲兩張表的性能會更好,但是,特別是大量的數據。 – michi

+0

這是一個有趣的想法,但我找不到任何文章來證明這一點。你有看到嗎? – Alexander

0

你必須使用SUBSTRING_INDEX這裏。

SQLFiddle

 
SELECT id, name 
    FROM table_item 
WHERE REPLACE(
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(param, ':', -2), 
          ',',1), '"','') = 'red' 
     OR 
     REPLACE(
      SUBSTRING_INDEX(
       SUBSTRING_INDEX(param, ':', -2), 
          ',',1), '"','') = 'yellow'; 

我還添加了REPLACE - 這是沒有必要的,但你不會有涉及的彩色輸入雙引號。正如你所看到的,對於其他任何參數都可以做到這一點。