2013-08-29 93 views
1

我有以下的列的mysql表:的MySQL/PHP查詢反向關係

ID  Units 
1  1234,6543,9876 
2  1234,6543 
3  6543 
4  9876 
5  0987 

我想扭轉的關係,得到這樣的輸出:

Unit IDs 
1234 1,2 
6543 1,2,3 
9876 1,4 
0987 5 

我想知道這是否可以在一個查詢或一些PHP中完成,沒有通過爆炸等塊?

+4

你有沒有考慮將數據存儲在規範化的方式,而不是反轉的關係? – zedfoxus

+0

也許你可以使用IN函數? http://www.tutorialspoint.com/mysql/mysql-in-clause.htm –

+0

以下是一個問題,當你說單位是「1234,6543,9876」時,你的意思是這是一個字符串,還是什麼? – manchicken

回答

1

用逗號分隔的列表中的SQL是awkward。這是一個非規範化的設計,SQL不適合以這種格式處理數據。

我會將所有數據提取回PHP並在其中進行處理。

$id_per_unit = array(); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $unit_array = explode(",", $row["Units"]); 
    foreach ($unit_array as $unit) { 
    $id_per_unit[$unit][] = $row["Id"]; 
    } 
} 
+0

謝謝!這是我使用的臨時解決方案,將根據建議調查將設計更改爲規範化。 – Richard

0

事情是這樣的:

$query = "SELECT `Unit`, `IDs` FROM `table` ORDER BY `Unit`"; 
$data = mysqli_query($con, $query); 

$prev_unit = ''; 
while ($row = mysqli_fetch_array($data)) { 
    if ($prev_unit != $row['Unit']) { 
     // echo a new row with the new unit and then ID 
    } else { 
     // echo just the ID in the same row, this unit is the same as the last one. 
    } 
    $prev_unit = $row['Unit']; 
} 
0

由於只有SQL,你可以做這樣的事情:

SELECT unit , GROUP_CONCAT(id) 
FROM (
    SELECT id,substring_index(Units,',',1) AS unit 
    FROM Table1 
    UNION 
    SELECT id,REPLACE(
      REPLACE(SUBSTRING_INDEX(Units,',',2),SUBSTRING_INDEX(Units,',',1),'') 
       ,',','') AS unit 
    FROM Table1 
    UNION 
    SELECT id,REPLACE(
      REPLACE(SUBSTRING_INDEX(Units,',',3),SUBSTRING_INDEX(Units,',',2),'') 
       ,',','') AS unit 
    FROM Table1) AS UNITS 
WHERE unit != '' 
GROUP BY unit 

SQLFIDDLE