2010-07-19 5 views
2

두 테이블의 UNION ALL을 사용하여 MySQL보기를 만들었으므로 해당 테이블의 동일한 데이터 (즉, tbl1.author2 AS translator ... tbl2.translator AS translator)에 대해 동일한 열 이름을 얻습니다. 문제는 그보기에서 무언가를 선택하려고 할 때 데이터의 절반이 원래 값 대신 BLOB으로 나오는 것입니다.

뷰 정의는 다음과 같습니다적절한 데이터 대신 MySQL보기의 BLOB

SELECT e.id AS prod_id, 
e.price_vat AS price_vat, 
e.product AS title, 
e.authors AS author, 
e.isbn AS isbn, 
e.ean AS ean, 
e.page_count AS page_count, 
e.publishers AS publishers, 
e.issue_year AS issue_year, 
'e' AS type 
FROM ama_euromedia_products AS e 
UNION ALL 
SELECT 
k.publishers AS publishers, 
DATE_FORMAT(k.publication_date, '%Y') AS issue_year, 
k.ean AS ean, 
k.number_of_pages AS page_count, 
k.author AS author, 
k.isbn AS isbn, 
k.title_full AS title, 
k.price_amount AS price_vat, 
k.internal AS prod_id, 
'k' AS type 
FROM ama_kosmas_products AS k 

테이블 정의 :

CREATE TABLE `ama_euromedia_products` (
    `id` int(9) NOT NULL, 
    `product` text COLLATE utf8_czech_ci NOT NULL, 
    `isbn` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `authors` text COLLATE utf8_czech_ci, 
    `publishers` text COLLATE utf8_czech_ci, 
    `price` float(9,0) DEFAULT NULL, 
    `price_vat` float(9,0) DEFAULT NULL, 
    `vat` int(3) DEFAULT NULL, 
    `availability` tinyint(1) DEFAULT NULL, 
    `genres` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `ean` bigint(14) DEFAULT NULL, 
    `page_count` int(7) DEFAULT NULL, 
    `issue_year` int(4) DEFAULT NULL, 
    `supply_date` timestamp NULL DEFAULT NULL, 
    `width` int(7) DEFAULT NULL, 
    `height` int(7) DEFAULT NULL, 
    `weight` int(7) DEFAULT NULL, 
    `binding` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `long_v` text COLLATE utf8_czech_ci, 
    `short` text COLLATE utf8_czech_ci, 
    `imgurl` text COLLATE utf8_czech_ci, 
    `is_preliminary` tinyint(1) DEFAULT NULL, 
    `stack_date` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `invoice_only` tinyint(1) DEFAULT NULL, 
    `new` tinyint(1) DEFAULT NULL, 
    `sale` tinyint(1) DEFAULT NULL, 
    `return_v` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `indexy` (`id`,`isbn`,`genres`,`ean`,`issue_year`,`supply_date`,`stack_date`,`new`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 


CREATE TABLE `ama_kosmas_products` (
    `id` int(7) NOT NULL AUTO_INCREMENT, 
    `internal` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `isbn` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `ean` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `contained_items` text COLLATE utf8_czech_ci, 
    `title_original` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `title_full` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `subtitle` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `other_text` text COLLATE utf8_czech_ci, 
    `languages` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `author` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `illustrator` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `translator` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `number_of_pages` int(7) DEFAULT NULL, 
    `subject_scheme_name` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `subject_code` int(7) DEFAULT NULL, 
    `subject_heading_text` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `media_file_label` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `media_file_thumbnail` varchar(255) COLLATE utf8_czech_ci DEFAULT NULL, 
    `publishers` text COLLATE utf8_czech_ci, 
    `publishing_status` tinyint(2) DEFAULT NULL, 
    `publication_date` timestamp NULL DEFAULT NULL, 
    `product_availability` tinyint(2) DEFAULT NULL, 
    `on_hand` int(7) DEFAULT NULL, 
    `on_order` int(7) DEFAULT NULL, 
    `price_amount` int(7) DEFAULT NULL, 
    `price_tax_rate_code` varchar(1) COLLATE utf8_czech_ci DEFAULT NULL, 
    `price_tax_rate_percent` tinyint(2) DEFAULT NULL, 
    `price_tax_amount` int(7) DEFAULT NULL, 
    `price_taxable_amount` int(7) DEFAULT NULL, 
    `reissue_date` timestamp NULL DEFAULT NULL, 
    `invoice_only` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `internal` (`internal`) 
) ENGINE=MyISAM AUTO_INCREMENT=43341 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci; 

어떤 생각이 이유가 될 수 있을까?

+0

"BLOB로 나온다"는 것은 무엇을 의미합니까? –

+0

@Pekka VARCHAR 대신 BLOB 데이터 유형, 기본적으로 다음과 같습니다. http://img826.imageshack.us/img826/248/blob.jpg – cypher

답변

9

UNION으로보기를 만들 때 해당 열의 데이터 유형이 같거나 (적어도 하나를 다른 것으로 변환 할 수있을만큼 충분히 유사해야 함) 확인해야합니다. 현재의 경우보기의 첫 번째 열은 publishers 또는 price_vat이고 BLOB은 제외하고는 데이터 형식 정의가 없습니다.

당신이 정말보기로이 필요한 경우, 당신은 시도 할 수 ...

SELECT e.price_vat AS price_vat, 
     NULL  AS publishers, 
     ...etc... 
     'e'   AS type 
    FROM ama_euromedia_products AS e; 
UNION ALL 
SELECT 
    NULL   AS price_vat, 
    k.publishers AS publishers, 
    ...etc... 
    'k'   AS type 
    FROM ama_kosmas_products AS k; 

각 열에 하나의 데이터 유형을 얻을 수 있습니다.

+0

기본적으로 문제는 e에서 파생 된 prod_id의 예입니다. k에서 파생 된 INT (9) 및 prod_id입니다. VARCHAR (255)입니까? – cypher

+0

광고. 편집 - 게시자가 도움이되지 않는 NULL을 설정하면보기의 두 부분에 정확히 동일한 별칭의 열 이름이 있습니다. 이것이 바로 내가보기로하는 이유입니다. 올바르게 이해하면 원래 테이블의 필드 데이터 유형을 변경하면 도움이됩니까? – cypher

+2

원본 테이블을 변경하는 대신 SELECT CAST (e.price_vat AS VARCHAR (255)) AS price_vat' (또는 유사)를 시도해 볼 수 있습니다. 그게 더 좋을지도 몰라. 'UNION'의 후반부에 첫 번째 질의와 다른 경우 열 이름을 설정하는 것도 중요하지 않습니다. 보기의 열은 하나의 이름 만 가질 수 있습니다. –

관련 문제