如何用PHP&;正确处理n:m关系;MySQL?

如何用PHP&;正确处理n:m关系;MySQL?,php,mysql,database,join,nm,Php,Mysql,Database,Join,Nm,我有三张桌子: +-----------------+ | validations | +----+-------+----+ | id | param | ... +----+-------+ +-----------------+ |验证| +----+-------+----+ |id | param |。。。 +----+-------+ +------------------+ |替代品| +----+-------------+ |id |更换| +----+--------

我有三张桌子:

+-----------------+ | validations | +----+-------+----+ | id | param | ... +----+-------+ +-----------------+ |验证| +----+-------+----+ |id | param |。。。 +----+-------+ +------------------+ |替代品| +----+-------------+ |id |更换| +----+-------------+ +--------------------------------+ |验证替换| +---------------+----------------+ |验证|更换| 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 ) ... ... [6] =>stdClass对象 ( [id]=>11 [搜索参数]=>Dänische Belletristik [替换]=>丹麦 ) [7] =>stdClass对象 ( [id]=>11 [搜索参数]=>Dänische Belletristik [替换]=>小说 ) ... 现在,在我的PHP数组中,我多次使用相同的“search_param”和“id”。把它打印到屏幕上太糟糕了。我可以按“id”对数据进行分组以避免出现这种情况,但是我只有1个可用的“替换”值

我想要的结果是这样的:

... [7] => stdClass Object ( [id] => 11 [search_param] => Dänische Belletristik [replacement] => array(Denmark, Fiction) ) ... ... [7] =>stdClass对象 ( [id]=>11 [搜索参数]=>Dänische Belletristik [替换]=>阵列(丹麦,虚构) ) ... 我想知道的是:在我的表结构中,仅仅通过修复查询就可以做到这一点吗?或者我必须在我的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'
您可以在PHP中通过使用结果数组对它们进行分组,假设您的结果对象是
$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
$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacements = $result['replacements'] ;
    $replacements[$currSearchParam] = explode(',', $currReplacements) ;
}
使用,您将获得每个搜索参数的所有结果行,以及逗号分隔字符串中的所有替换项,然后您可以通过在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
$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacements = $result['replacements'] ;
    $replacements[$currSearchParam] = explode(',', $currReplacements) ;
}

看来你需要

非常感谢。事实上,GROUP_CONCAT对我来说是新事物,但它似乎正是我想要的。@d.hill不客气:)GROUP_CONCAT非常有用,这样可以节省额外的迭代次数。