2011-01-25 35 views
0

我有3个表:如何正确处理与PHP和MySQL的n:m关系?

 
+-----------------+ 
| 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'替换'值。

什么我要找的会是这样一个结果:

 
... 
[7] => stdClass Object 
(
    [id] => 11 
    [search_param] => Dänische Belletristik 
    [replacement] => array(Denmark, Fiction) 
) 
... 

我想知道:这可能与我的表结构由刚刚杀青的查询?或者我必须关心我的PHP代码 - 如果是的话:任何提示如何做到最好?有很多数据... 我的表结构是否正确?对于数据库,我仍然有点不确定...

此致敬意。

回答

1

它看起来像你想显示某个搜索参数的所有替换?假设你的查询是这样的:

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 

随着GROUP_CONCAT你会得到所有为每个搜索PARAM一个结果行,及其所有REPL以逗号分隔acements字符串,然后你就可以很容易地在PHP遍历结果工作:

$replacements = array() ; 
foreach ($results as $result) { 
    $currSearchParam = $result['search_param']; 
    $currReplacements = $result['replacements'] ; 
    $replacements[$currSearchParam] = explode(',', $currReplacements) ; 
} 
+0

非常感谢你。事实上,GROUP_CONCAT对我来说是新的,但它似乎正是我所期待的。 – 2011-01-25 23:26:59

相关问题