2010-05-17 2 views
0

4 개의 테이블에서 데이터를 가져와야합니다. 4 개의 쿼리를 사용하여 스크립트를 작성했지만 아약스에서 사용하고 하나의 쿼리로 수행하지는 않습니다. 여기4 개가 아닌 하나의 쿼리가 가능합니까?

$query1 = "SELECT `id`,`name_ar` FROM `tour_type` ORDER BY `order`"; 
$query2 = "SELECT `id`,`name_ar` FROM `hotel_type` ORDER BY `order`"; 
$query3 = "SELECT `id`,`name_ar` FROM `food_type` ORDER BY `order`"; 
$query4 = "SELECT `id`,`name_ar` FROM `cities` WHERE `id_parrent` = '$id_parrent' ORDER BY `name_ar`"; 

가 한 쿼리에서 작성할 수 있습니다 ... 쿼리입니까? 감사 테이블의

구조 tour_type

id | name_ar | name_ru | name_en | order | 

food_type 
id | name_ar | name_ru | name_en | order | 

hotel_type 
id | name_ar | name_ru | name_en | order | 

cities 
id | id_parrent | name_ar | name_ru | name_en | order | 
+1

대부분의 대답은 'UNION (ALL)'을 사용하는 것이 좋습니다. 모든 테이블에서'columns names'가 동일하다는 점은 덜 중요하지만'column data types'은 반드시 호환 가능해야한다는 점을 강조하고 싶습니다. – van

답변

4

UNION [ALL] 함수를 사용하면 둘 이상의 쿼리를 결합 할 수 있지만 열 데이터 형식과 순서는 모든 쿼리간에 동일해야합니다. 또한 UNION은 중복을 제거하므로 중복을 제거하지 않으므로 UNION ALL을 사용하는 것보다 속도가 느립니다.

UNION 문은 각 문에 대해 ORDER BY를 허용하지 않지만 대괄호 안에 쿼리를 넣으면 MySQL이이를 지원합니다. 사용 : 같은 키 식별자의 일부 종류와

당신이 컬럼의 일관된 수를 가지고 있기 때문에
(SELECT id, name_ar FROM tour_type ORDER BY order) 
UNION ALL 
(SELECT id, name_ar FROM hotel_type ORDER BY order) 
UNION ALL 
(SELECT id, name_ar FROM food_type ORDER BY order) 
UNION ALL 
(SELECT id, name_ar FROM cities WHERE id_parent = ? ORDER BY name_ar) 
+0

예, UNION ALL의 마술은 결과 집합을 그대로 둡니다. 따라서 개별 쿼리의 순서를 유지합니다. 위에서 @David M의 제안을 사용하려면 반드시 타입 컬럼을 추가해야합니다. –

+0

@Marcus Adams : 물론 ... 필요한 경우 (또는 요청한 경우). 나는 그러한 요구 사항을 볼 수 없다. –

1

빠르고 쉬운 방법은 UNIONselect 문으로 시도하는 것입니다. 열의 수가 같고 열 이름이 같으면 데이터베이스 시스템에서 빼앗아 야합니다.

많은 의견과 스타일이 있기 때문에 관계형 모델링/디자인으로 들어가서는 안되지만 ... 모두 "유형"이라면 단일 테이블에 있어야합니다. 이 고양이를 다듬는 많은 다른 방법.

+0

일부 링크가 도움이 될 것입니다 – Simon

+1

열 이름이 실제로 같을 필요는 없습니다. MySQL은 지정된 첫 번째 열 이름을 사용합니다. –

+4

UNION/UNION ALL 문에는 하나의 ORDER BY 절만있을 수 있습니다. –

2

물론, UNION을 사용하십시오.

SELECT id,name_ar,'tour' FROM tour_type 
UNION 
SELECT id,name_ar,'hotel' FROM hotel_type 
UNION 
SELECT id,name_ar,'food' FROM food_type 
UNION 
SELECT id,name_ar,'cities' FROM cities WHERE id_parrent = $id_parrent 

당신은 당신이 원하는대로 ORDER 함께 놀러해야 할 수도 있습니다를 : 당신에게 중요한 경우 행의 소스에 대한 의사 열을 포함 할 수있다.

+0

UNION/UNION ALL 문에는 하나의 ORDER BY 절만있을 수 있습니다. OP는 각 구문에 대해 ORDER BY를 나열합니다 ... –

+0

'tour'AS row_type',' 'hotel'AS row_type'와 같은 유형의 컬럼을 제공하십시오. –

+0

의사 열에 +1. 또한 그 칼럼에 이름을 부여하고 겹침이 없다는 것을 알기 때문에 불필요한 정렬 및 필터를 피하기 위해 UNION 대신 UNION ALL을 사용합니다. – van

0

나는 당신이이 같은 UNION을 사용하여 할 수 있다고 생각 :

SELECT `id`,`name_ar` FROM `tour_type` ORDER BY `order` 

UNION 

SELECT `id`,`name_ar` FROM `hotel_type` ORDER BY `order` 

그것은 UNION을 사용하거나 UNION ALL을 사용하는 당신에게 달려 있습니다. 더 구체적인 예를 여기에서 볼 수 있습니다. Union sqlserver

0

, 당신이 함께 노동 조합을 할 수 : 잘 작성된

select 'TBL1' as table_identifier, id, name from TBL1 
union 
select 'TBL2' as table_identifier, id, name from TBL2 
... 

그러나 4 쿼리, 개별 개체에 매핑하면 더 나은 디자인이 될 것이며 추가 밀리 초가 절실히 필요하지 않으면 빠르고 좋은 쿼리를 통해 좋은 디자인을 고수 할 것입니다.

관련 문제