简体   繁体   中英

SQL query add value from one column to another column as a new row just once

I've looked everywhere (I think I have) and can't find an answer or if this is even possible. I've got 3 database tables:

(1) product_option_image - with the following 3 columns

product_id     image                         product_option_value
1              1-additional-image-1.jpg        234
1              1-additional-image-2.jpg        234
1              1-additional-image-3.jpg        237
2              main_image-2.jpg                265
2              2-additional-image-1.jpg        975
2              2-additional-image-2.jpg        265

(2) product - with the following 3 columns

product_id    image                 backimage
1             main_image-1.jpg        backimage-1.jpg
2             main_image-2.jpg        backimage-2.jpg

(3) product_option_value - with the following 3 columns

product_id     product_option_value    link
1                234                   0
1                234                   0
1                237                   1
2                265                   0
2                975                   1
2                265                   0

I'm trying to produce a list of the "additional" images from (1) product_option_image that aren't "links" (table (3) product_option_value.link) and aren't a main_image (table (2) product.image) which is easy enough, but I want to add the backimage from table (2) (product.backimage) to the image column as a new row - just once. At the moment, I have the following:

$notlinkImages = $this->db->query("SELECT i.*, z.backimage FROM " . DB_PREFIX . "product_option_image AS i
 LEFT JOIN " . DB_PREFIX . "product AS z ON (z.product_id = i.product_id) 
 LEFT JOIN " . DB_PREFIX . "product_option_value v ON (i.product_option_value_id = v.product_option_value_id)
 WHERE i.product_id = '" . (int)$row['product_id'] . "' AND ( v.link IS NULL OR v.link = 0 ) AND ( z.image != i.image)")->rows;

It produces an output like so:

product_id     image                         product_option_value     backimage
1              1-additional-image-1.jpg        234                    backimage-1.jpg
1              1-additional-image-2.jpg        234                    backimage-1.jpg
2              2-additional-image-2.jpg        265                    backimage-2.jpg

But what I am after is:

product_id     image                         product_option_value    
1              1-additional-image-1.jpg        234                  
1              1-additional-image-2.jpg        234 
1              backimage-1.jpg
2              2-additional-image-2.jpg        265                    
2              backimage-2.jpg

Could someone please tell me if/how this can be done? Thanks

In your case you can use UNION ALL to union the option images and backimages.

For example:

select poi.product_id,poi.image from product_option_image poi 
inner join product p on p.product_id = poi.product_id 
inner join product_option_value pov on pov.product_id = poi.product_id 
and pov.product_option_value = poi.product_option_value /* in your table the column name is `product_option_value` but in your code it's `product_option_value_id`,so...it doesnt matter here you can fix it by yourself */
where p.image != poi.image and (pov.link IS NULL or pov.link = 0)
union all 
select product_id,backimage as image from product;

By the way you table 3 product_option_value contain duplicates, it will cause duplicate results after join.

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