2014-01-22 3 views
0

나는 약간의 조사를했고, 내가 원하는 반대의 것을하는이 질문을 발견했다. (그들은 자동차를위한 완전한 목록을위한 범위를 만들기를 원한다). 내 경우MySQL. 범위 사이의 연도 목록

MySQL. Select years range

나는 몇 년 나열 할하지만 내 년 범위에 있습니다.


업데이트 정보

쿼리

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

단지 (


내 데이터를 (I 공간을 절감하고 구체적으로 테이블 사이의 관계를 넣지 않았다) 단순화를 위해 두 행) :

| 만들다 | 모델 | begin_year | end_year | 모터 |

| 시보레 | 무심한 | 2002 | 2005 | 4 Cil 2.2 Lts |

| 포드 | 탐색기 | 1995 | 1996 | 6 Cil 3.3 Lts |

...

그리고 나는이

과 같이 MySQL의 쿼리를 얻고 싶은 | 시보레 | 무심한 | 2002 | 4 Cil 2.2 Lts |

| 시보레 | 무심한 | 2003 | 4 Cil 2.2 Lts |

| 시보레 | 무심한 | 2004 | 4 Cil 2.2 Lts |

| 시보레 | 무심한 | 2005 | 4 Cil 2.2 Lts |

| 포드 | 탐색기 | 1995 | 6 Cil 3.3 Lts |

| 포드 | 탐색기 | 1996 | 6 Cil 3.3 Lts |

나는 CASE, MIN, MAX와 관련된 몇 가지 MySQL 쿼리를 시도했지만이 중 아무 것도 원하는 결과를 얻지 못했습니다. 대답은 하위 쿼리를 사용하므로 계속 시도 할 것입니다.

감사합니다.

+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 

말했다되는 것을 I 메인 테이블에서 연도 데이터를 제거하고이를 결합하기 위해 별도의 테이블에 넣는 것이 훨씬 낫다고 생각하십시오. 이 이런 구조를 생성 할 것이다 :

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

시도했지만 만들지는 않았습니다. 내 질문에 ... 데모와 당신의 도움을 주셔서 감사합니다. –