如何简化这两个MySQL查询
这一定很容易,但我不记得以前是怎么做的。 我正在尝试在记录ID匹配的查询中进行另一个查询:如何简化这两个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_
/*
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)