如何简化这2个MySQL查询

时间:2017-02-20 22:28:20

标签: mysql

这一定很容易,但我不记得以前是怎么做过的。 我试图在查询中进行另一个查询,其中记录ID匹配:

/*
    tables:
      models:
        model_id
        model_name

      models_years:
        model_year_id
        model_id
        year
*/

$models = DBW::run('SELECT * FROM models', [], true);
$models_years = DBW::run('SELECT * FROM models_years', [], true);

$output = [];

foreach ($models as $model)
{
    $years = [];
    foreach ($models_years as $model_year)
    {
        if ($model_year['model_id'] == $model['model_id'])
        {
            $years[] = $model_year['year'];
        }
    }
    $output[] = [
        'model_name' => $model['model_name'],
        'years' => $years
    ];
}

var_dump( $output );

我使用PDO(设置:ATTR_DEFAULT_FETCH_MODE = FETCH_ASSOC)和" DBW :: run"函数返回$ stmt-> fetchAll()。 这只是我尝试做或改进的一个例子,我知道可以在一个SQL中完成所有这些操作,我之前已经完成并且无法完成记得! :(

1 个答案:

答案 0 :(得分:0)

SELECT m.model_name, y.`year`
FROM models AS m
LEFT JOIN models_years As y ON m.model_id = y.model_id

或者根据您的原始问题,您可能需要以下内容:

SELECT m.model_name, group_concat(y.`year`) AS `year`
FROM models AS m
LEFT JOIN models_years As y ON m.model_id = y.model_id
GROUP BY 1

为什么?

1 - 连接表以减少SQL调用

2 - 对结果进行分组(BY 1 == BY m.model_name,这里只是一个懒惰的速记)

3 - group_concat(...)默认会生成:year1,year2,year3,...然后你可以使用PHP explode(',',...)更改为数组如果你需要