繁体   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