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