2017-02-20 16 views
0

これは簡単なものでなければなりませんが、以前の私のやり方を覚えていません。 私はレコードIDが一致しているクエリ内で別のクエリを作成しようとしています:この2を簡略化する方法MySQLのクエリ

/* 
    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 ::実行" 機能は$ stmt-> fetchAllのを返します。 ()。 これは私がやろうとしていることの一例に過ぎません。私はすべてのことを1つのSQLで行うことができることを知っています。 :(

答えて

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を呼び出す減らすために、テーブルに参加 - ? GROUP結果(BY 1 == m.model_nameで、ここではちょっと怠惰な略語)

3 - group_concat 。)デフォルトでは、year1、year2、year3、...となります。必要に応じてPHPのexplode( '、'、...)を使用して配列に変更します。

+0

ありがとうございます! 2番目のものはまさに私が望んでいたものです、そして、もしあなたが何が起こるかを説明してくれれば、そこには大いに感謝されるでしょう。 –

0

テーブルを結合し、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']); 
} 
+0

時間と労力ありがとうございました。それは最高の1つだけを選ぶことができますが、これも有効な答えです! –

0
SELECT model_name, year FROM models, models_years WHERE 
    models.model_id=models_years.model_id 

それとも、あなたは、JOIN構文を好む場合は、これを行うには

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

別の方法は、選択サブです。

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

これは後方です。元のクエリにはすべてのモデルが含まれます。これにより、 'model_years'にないモデルは除外されます。 – Barmar

+0

また、あなたは年のリストを返さない。 '$ years'配列はどのように記入しますか? – Barmar

関連する問題