[英]How to handle a n:m relation correctly with PHP&MySQL?
我有3張桌子:
+-----------------+ | validations | +----+-------+----+ | id | param | ... +----+-------+
+------------------+ | replacements | +----+-------------+ | id | replacement | +----+-------------+
+--------------------------------+ | validations-replacements | +---------------+----------------+ | validation_id | replacement_id | +---------------+----------------+
現在,我在該表上運行我的SQL查詢(當然有聯接)。 我從PHP中得到的是……。 像那樣:
... [6] => stdClass Object ( [id] => 11 [search_param] => Dänische Belletristik [replacement] => Denmark ) [7] => stdClass Object ( [id] => 11 [search_param] => Dänische Belletristik [replacement] => Fiction ) ...
現在,在我的PHP數組中,我有多次相同的“ search_param”和“ id”。 將其打印到屏幕很爛。 我可以按“ id”將數據分組以避免這種情況,但是那時我只有1個“ replacement”值可用。
我正在尋找的結果將是這樣的:
... [7] => stdClass Object ( [id] => 11 [search_param] => Dänische Belletristik [replacement] => array(Denmark, Fiction) ) ...
我想知道的是:僅通過修復查詢,表結構是否可以實現? 還是我必須在我的PHP代碼中關心這一點-如果是這樣的話:有什么提示可以最好地做到這一點? 數據很多……我的表結構正確嗎? 對於數據庫,我仍然不確定。
最好的祝福。
您似乎要顯示某個搜索參數的所有替換項? 假設您的查詢類似於:
SELECT *
FROM validations_replacements vr
INNER JOIN validations v ON v.id = vr.validation_id
INNER JOIN replacements r ON r.id = vr.replacement_id
WHERE v.param = '$search_param'
您可以通過使用result數組將它們分組在PHP中,假設您的result對象是$results
:
$replacements = array() ;
foreach ($results as $result) {
$currSearchParam = $result['search_param'];
$currReplacement = $result['replacement'] ;
if (!isset($replacements[$currSearchParam])) {
$replacements[$currSearchParam] = array() ;
}
$replacements[$currSearchParam][] = $currReplacement;
}
//I'll let you fill in the blanks like object id or naming the array keys as you wish
或者,您可以在mysql中進行操作,然后僅在PHP中遍歷結果:
SELECT v.id, v.param, GROUP_CONCAT(r.replacement)
FROM validations_replacements vr
INNER JOIN validations v ON v.id = vr.validation_id
INNER JOIN replacements r ON r.id = vr.replacement_id
WHERE v.param = '$search_param'
GROUP BY v.id
使用GROUP_CONCAT
您將為每個搜索參數獲得一個單一的結果行,並以逗號分隔的字符串替換所有結果行,然后可以通過在PHP中遍歷結果來輕松地進行操作:
$replacements = array() ;
foreach ($results as $result) {
$currSearchParam = $result['search_param'];
$currReplacements = $result['replacements'] ;
$replacements[$currSearchParam] = explode(',', $currReplacements) ;
}
看起來您可以使用GROUP_CONCAT
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.