我有以下的列的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中完成,沒有通過爆炸等塊?
我有以下的列的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中完成,沒有通過爆炸等塊?
用逗號分隔的列表中的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"];
}
}
謝謝!這是我使用的臨時解決方案,將根據建議調查將設計更改爲規範化。 – Richard
事情是這樣的:
$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'];
}
由於只有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
你有沒有考慮將數據存儲在規範化的方式,而不是反轉的關係? – zedfoxus
也許你可以使用IN函數? http://www.tutorialspoint.com/mysql/mysql-in-clause.htm –
以下是一個問題,當你說單位是「1234,6543,9876」時,你的意思是這是一個字符串,還是什麼? – manchicken