Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何简化这两个MySQL查询_Mysql - Fatal编程技术网

如何简化这两个MySQL查询

如何简化这两个MySQL查询,mysql,Mysql,这一定很容易,但我不记得以前是怎么做的。 我正在尝试在记录ID匹配的查询中进行另一个查询: /* tables: models: model_id model_name models_years: model_year_id model_id year */ $models = DBW::run('SELECT * FROM models', [], true); $models_

这一定很容易,但我不记得以前是怎么做的。 我正在尝试在记录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\u DEFAULT\u FETCH\u MODE=FETCH\u ASSOC),并且“DBW::run”函数返回$stmt->fetchAll()。 这只是我正在尝试做或改进的一个示例,我知道可以在一个SQL中完成所有这些,我以前做过,记不得了!:(

或者根据您最初的问题,以下可能是您需要的:

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-将结果分组(按1==按m.model_名称,这里只是一个懒散的速记)


3-默认情况下,group_concat(…)将生成:year1、year2、year3,…,然后您可以使用PHP explode('、'、…)更改为数组,如果需要

加入表,并使用
group_concat
组合每个模型的所有年份。然后使用
explode()
将其拆分为数组

$output = DBW::run('select m.model_name, GROUP_CONCAT(y.year) AS years
                    FROM models AS m
                    LEFT JOIN models_years AS y ON m.model_id = y.model_id
                    GROUP BY m.model_id', [], true);
foreach ($output as &$row) {
    $row['years'] = explode(',', $row['years']);
}
或者,如果您更喜欢联接语法

SELECT model_name, year FROM models JOIN models_years ON 
    models.model_id=models_years.model_id

另一种方法是使用子选择

select * from models where model_id in (select model_id from models_years)

这是向后的。原始查询将包括所有模型,这将省略所有不在
模型年数
中的模型。您也不会返回年份列表。您将如何填写
$years
数组?谢谢!第二个正是我想要的,如果您能解释发生了什么,将会非常困难谢谢。谢谢你的时间和努力。它只让我选择一个最好的,但这也是一个工作的答案!
SELECT model_name, year FROM models JOIN models_years ON 
    models.model_id=models_years.model_id
select * from models where model_id in (select model_id from models_years)