2017-02-20 2 views
0

Это должно быть легко, но я не могу вспомнить, как я это делал раньше. Я пытаюсь сделать другой запрос внутри запроса, в котором идентификаторы записей являются матч:Как упростить это 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(). Это всего лишь пример того, что я пытаюсь сделать или улучшить, я знаю, что все это можно сделать в одном 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 == BY m.model_name, просто ленивая стенография здесь)

3 - group_concat (.. .) будет по умолчанию выдавать: year1, year2, year3, ... и затем вы можете использовать PHP explode (',', ...) для изменения массива, если вам нужно

+0

Спасибо! второй - это именно то, что я хотел, и если бы вы, пожалуйста, объясните, что произойдет, мы будем очень благодарны. –

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

Спасибо за внимание и время. Это только позволяет мне выбрать один, как лучший, но это также рабочий ответ! –

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

Смежные вопросы