簡體   English   中英

如何使用PHP和MySQL正確處理an:m關系?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM