简体   繁体   中英

Query result not working with array type in PostgreSQL

I have two tables which contains a column with data type array in PostgreSQL. The structure is like below:

tbl_tour_packages

在此输入图像描述

tbl_header_images

在此输入图像描述

I have a query which contains several joins. The query is working fine with other joins and showing no error. But missing the values from tbl_header_images. The query is:

SELECT 
    t1.tour_id AS pid,
    t1.tour_name AS title,
    t1.tour_duration AS nights,
    t1.tour_price_full AS price,
    t1.discount AS discount,
    t1.tour_seo_title AS seo,
    t3.category AS category,
    t4.image_names[1] AS image_url,
    CASE WHEN max(s.state_name) IS NULL THEN NULL ELSE array_agg(s.state_name) END AS state,
    CASE WHEN max(o.destination) IS NULL THEN NULL ELSE array_agg(o.destination) END AS destinations
FROM tbl_tour_packages t1
    LEFT JOIN tbl_countries t2 ON t1.tour_country_iso = t2.iso
    LEFT JOIN tbl_categories t3 on t1.tour_category_id = t3.id
    LEFT JOIN tbl_header_images t4 ON t1.tour_id = t4.package_id
    LEFT JOIN tbl_states AS s ON (t1.tour_state @> array[s.state_code])
    LEFT JOIN tbl_destinations AS o ON (t1.tour_destination @> array[o.id])
WHERE t1.tour_status = 1
GROUP BY 1,7,8
ORDER BY view_count ASC LIMIT 6

I want to get the 'image_name' from tbl_header_images. Any quick help or suggestion will be appreciated.

before WHERE clause you should be able to do something like:

, unnest(image_names) _image_names

and then in select statement aggregate that back into an array

array_agg(_image_names) AS image_names

I don't quite get the t4.image_names[1] AS image_url attempt, but I'm sure you can pick it up from here.

so the whole query would be something like:

edit: I've stripped extra groupping

SELECT 
    t1.tour_id AS pid,
    t1.tour_name AS title,
    t1.tour_duration AS nights,
    t1.tour_price_full AS price,
    t1.discount AS discount,
    t1.tour_seo_title AS seo,
    t3.category AS category,
    (array_agg(_image_names))[1] AS image_url,
    CASE WHEN max(s.state_name) IS NULL THEN NULL ELSE array_agg(s.state_name) END AS state,
    CASE WHEN max(o.destination) IS NULL THEN NULL ELSE array_agg(o.destination) END AS destinations
FROM tbl_tour_packages t1
    LEFT JOIN tbl_countries t2 ON t1.tour_country_iso = t2.iso
    LEFT JOIN tbl_categories t3 on t1.tour_category_id = t3.id
    LEFT JOIN tbl_header_images t4 ON t1.tour_id = t4.package_id
    LEFT JOIN tbl_states AS s ON (t1.tour_state @> array[s.state_code])
    LEFT JOIN tbl_destinations AS o ON (t1.tour_destination @> array[o.id])
    , unnest(t4.image_names) AS _image_names
WHERE t1.tour_status = 1
GROUP BY 1,7
ORDER BY view_count ASC LIMIT 6

alternatively I'd go with subselect:

SELECT t1.*,
    (SELECT image_names[1] FROM tbl_header_images WHERE package_id = t1.tour_id) AS image_url
FROM t1, t2, t3
WHERE ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM