0

我有 3 张桌子:

+-----------------+
| 验证 |
+----+-------+----+
| 编号 | 参数 | ...
+----+-------+
+------------------+
| 替换|
+----+--------------+
| 编号 | 更换|
+----+--------------+
+--------------------------------+
| 验证替换 |
+---------------+----------------+
| 验证ID | 替换ID |
+---------------+----------------+

现在我在这些表上运行我的 SQL 查询(当然有连接)。而我在 PHP 中收到的是 sth。像那样:

...
[6] => 标准类对象
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [替换] => 丹麦
)

[7] => 标准类对象
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [替换] => 小说
)
...

现在,在我的 PHP 数组中,我多次获得了相同的“search_param”和“id”。把它打印到屏幕上很糟糕。我可以按“id”对数据进行分组以避免这种情况,但是我只有 1 个“替换”值可用。

我正在寻找的结果是这样的:

...
[7] => 标准类对象
(
    [id] => 11
    [search_param] => Dänische Belletristik
    [替换] => 数组(丹麦,小说)
)
...

我想知道的是:我的表结构是否可以通过修复查询来实现?或者我是否必须在我的 PHP 代码中关心这一点 - 如果是这样:任何提示如何做到最好?有很多数据...我的表结构正确吗?当谈到数据库时,我仍然有点不确定......

最好的祝福。

4

2 回答 2

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获得每个搜索参数的所有单个结果行,以及逗号分隔字符串中的所有替换,然后您可以通过在 PHP 中迭代结果轻松使用:

$replacements = array() ;
foreach ($results as $result) {
    $currSearchParam = $result['search_param'];
    $currReplacements = $result['replacements'] ;
    $replacements[$currSearchParam] = explode(',', $currReplacements) ;
}
于 2011-01-25T22:58:50.397 回答
0

看起来你可以使用GROUP_CONCAT

于 2011-01-25T23:02:18.160 回答