简体   繁体   English

如何使用PHP和MySQL正确处理an:m关系?

[英]How to handle a n:m relation correctly with PHP&MySQL?

i've got 3 tables: 我有3张桌子:

+-----------------+
|   validations   |
+----+-------+----+
| id | param | ...
+----+-------+
+------------------+
|   replacements   |
+----+-------------+
| id | replacement |
+----+-------------+
+--------------------------------+
|    validations-replacements    |
+---------------+----------------+
| validation_id | replacement_id |
+---------------+----------------+

Now I'm running my SQL query on that tables (with joins of course). 现在,我在该表上运行我的SQL查询(当然有联接)。 And what I receive in PHP is sth. 我从PHP中得到的是……。 like that: 像那样:

...
[6] => stdClass Object
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [replacement] => Denmark
)

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

Now, in my PHP-Array I've got the same 'search_param' and 'id' multiple times. 现在,在我的PHP数组中,我有多次相同的“ search_param”和“ id”。 That sucks for printing it to screen. 将其打印到屏幕很烂。 I could group the data by 'id' to avoid that, but then I've only got 1 'replacement' value available. 我可以按“ id”将数据分组以避免这种情况,但是那时我只有1个“ replacement”值可用。

What I'm looking for would be an result like this: 我正在寻找的结果将是这样的:

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

What I want to know: Is that possible with my table structure by just fixing the query? 我想知道的是:仅通过修复查询,表结构是否可以实现? Or do I have to care about that in my PHP-Code - if so: any hints how to do it best? 还是我必须在我的PHP代码中关心这一点-如果是这样的话:有什么提示可以最好地做到这一点? There's plenty of data... Is my table structure correct? 数据很多……我的表结构正确吗? I'm still a bit uncertain when it comes to databases... 对于数据库,我仍然不确定。

Best regards. 最好的祝福。

It looks like you want to show all replacements for a certain search param? 您似乎要显示某个搜索参数的所有替换项? Assuming your query is something like: 假设您的查询类似于:

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'

You can either group them in PHP by playing with the result array, assuming your results object is $results : 您可以通过使用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

OR you can do it in mysql, then just iterate over the result in PHP: 或者,您可以在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

With GROUP_CONCAT you will get all a single result line for each search param, and all its replacements in a comma separated string, which you can then easily work with by iterating over the result in PHP: 使用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