2014-01-22 7 views
0

Я провел некоторое исследование и нашел этот вопрос, который делает то, что я хочу (они хотят создать диапазон для полного списка лет для автомобилей).MySQL. Перечислите годы между диапазоном

MySQL. Select years range

В моем случае я хочу перечислить эти годы, но мои годы находятся в пределах досягаемости.


Обновлено Информация

Запрос

SELECT make, model, begin_year, end_year, motor 
FROM general_information 
LIMIT 2; 

(я не ставил отношения между таблицами, чтобы уменьшить пространство и быть конкретными)


Мои данные (только две строки для простоты):

| сделать | модель | begin_year | end_year | двигатель |

| Chevrolet | Кавалер | 2002 | 2005 | 4 Cil 2.2 Lts |

| Форд | Проводник | 1995 | 1996 | 6 Cil 3.3 Lts |

...

И я хочу, чтобы получить MySQL запрос, который похож на этот

| Chevrolet | Кавалер | 2002 | 4 Cil 2.2 Lts |

| Chevrolet | Кавалер | 2003 | 4 Cil 2.2 Lts |

| Chevrolet | Кавалер | 2004 | 4 Cil 2.2 Lts |

| Chevrolet | Кавалер | 2005 | 4 Cil 2.2 Lts |

| Форд | Проводник | 1995 | 6 Cil 3.3 Lts |

| Форд | Проводник | 1996 | 6 Cil 3.3 Lts |

Я пробовал пару MySQL запросов, связанных с CASE, MIN, MAX, но ни один из них не дал мне желаемого результата. Я думаю, что ответ использует подзапрос, поэтому я буду продолжать пытаться

Заранее спасибо!

+2

является то, что данные в строке таблицы? или одной записи? –

+1

Запрос (ы), который вы пробовали. –

+0

Проблемы отображения данных обычно лучше всего обрабатываются в коде уровня представления/кода приложения (при условии, что у вас есть это) – Strawberry

ответ

2

Если вы действительно должны решить эту проблему в SQL слое, и вы не можете изменить схему таблицы general_information нормализовать данные год, мое предложение было бы ввести новую year_list таблицу, может присоединиться.Эта таблица будет довольно просто:

year_value 
1900 
1901 
1902 
... 
2020 

Очевидно, что вы бы использовать целый ряд лет, что подходит для вас

Тогда вы присоединиться к этой таблице:

SELECT 
    gi.make AS make, 
    gi.model AS model, 
    y.year_value AS model_year, 
    gi.motor AS motor 
FROM general_information AS gi 
INNER JOIN year_list AS y ON y.year_value BETWEEN gi.begin_year AND gi.end_year 
ORDER BY make ASC, model ASC, model_year ASC, motor ASC 

, как говорится, я подумайте, что вам гораздо лучше будет просто удалять данные года из основного стола и помещать его в отдельную таблицу для присоединения. Это будет производить структуру, как это:

general_information 
------------------- 
id <= create a new autoincrementing primary key field 
make 
model 
motor 

обеспечивают уникальный индекс по всей марке, модели и моторные поля

general_information_to_years 
---------------------------- 
gi_id <= foreign key to id field in general_information table 
year_value 

Вы бы обеспечить соединение первичного ключа на этих двух столбцах

Это будет представлять собой более правильно нормированную структуру базы данных.

Запрос будет выглядеть:

SELECT 
    gi.make AS make, 
    gi.model AS model, 
    giy.year_value AS model_year, 
    gi.motor AS motor 
FROM general_information AS gi 
INNER JOIN general_information_to_years AS giy ON gi.id = giy.gi_id 
ORDER BY make ASC, model ASC, model_year ASC, motor ASC 
+0

Майк, ты мне очень помог, я нашел то, что искал, спасибо за твою помощь !! –

0

вы можете попробовать этот запрос.

SELECT make,model,begin_year + years.incYears as year,motor 
FROM 
(SELECT (y1.value + y2.value + y3.value + y4.value + y5.value) as incYears 
    FROM 
    (SELECT 0 as value UNION SELECT 1)y1, 
    (SELECT 0 as value UNION SELECT 2)y2, 
    (SELECT 0 as value UNION SELECT 4)y3, 
    (SELECT 0 as value UNION SELECT 8)y4, 
    (SELECT 0 as value UNION SELECT 16)y5 
)years 
CROSS JOIN general_information 
WHERE begin_year+years.incYears <= end_year 
ORDER BY make,year 

sqlFiddle

+0

Я делаю попытку, но сложно интегрировать ее в моем запросе ... спасибо за твою демонстрацию и твою помощь –

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