Как получить два других значения из таблицы Produto_precos с запросом внутреннего соединения и предложением где like - PullRequest
0 голосов
/ 19 января 2019

У меня есть две таблицы, Product и Product_prices.Для каждого товара у меня есть три типа цен (ebook(0), impress(1) и combo(2)).Я хочу объединить две таблицы и получить три типа цен на этот предмет.Когда я выполняю предложение WHERE prices1_.value like '%1%'

таблица Product

------------------------------------------------
id    description        pages  title
------------------------------------------------
1     Harry Potter        230    harry Potter
2     Lord of The rings   950    Lord of the rings
3     game of thrones     980    game of thrones

таблица Product_prices

------------------------------------------------
Product_id bookType  value
------------------------------------------------
1          0           20.40 
1          1           28.00
1          2           40.00
2          0           15.00
2          1           25.50
2          2           42.00
3          0           21.00
3          1           30.50
3          2           47.00

это запрос на спящий режим:


    select 
    distinct 
    product0_.id as id1_0_,
    product0_.description as descript3_0_, 
    product0_.pages as pages4_0_, 
    product0_.title as title6_0_, 
    prices1_.Product_id as Product_1_1_0__, 
    prices1_.bookType as bookType2_1_0__, 
    prices1_.value as value3_1_0__ 
    from Produto produto0_ 
    inner join Product_prices prices1_ on product0_.id=prices1_.Product_id where lower(product0_.title) like '%1%' 
    or prices1_.bookType = 0 and prices1_.value like '%1%'
    or prices1_.bookType = 1 and prices1_.value like '%1%'
    or prices1_.bookType = 2 and prices1_.value like '%1%'

Я хотел бы получить следующие результаты или только одну строку с тремя значениями для каждого продукта:

------------------------------------------------
id    description        pages  title Product_id bookType  value
-----------------------------------------------------------------
2     Lord of The rings   950 Lord of...  2         0       15.00
2     Lord of The rings   950 Lord of...  2         1       25.00
2     Lord of The rings   950 Lord of...  2         2       42.00
3     game of thrones     980 game of...  3         0       21.00
3     game of thrones     980 game of...  3         1       30.50
3     game of thrones     980 game of...  3         2       47.00

, но у меня есть только следующие результаты:

------------------------------------------------
id    description        pages  title Product_id bookType  value
-----------------------------------------------------------------
2     Lord of The rings   950 Lord of...  2         0       15.00
3     game of thrones     980 game of...  3         0       21.00

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Напомните, какую часть проблемы не может решить следующая проблема ...

DROP TABLE IF EXISTS product;

CREATE TABLE product
(id SERIAL PRIMARY KEY
,title VARCHAR(30) NOT NULL
,pages INT NOT NULL
);

INSERT INTO product VALUES
(1,'Harry Potter',230),
(2,'Lord of the Rings',950),
(3,'Game of Thrones',980);

DROP TABLE IF EXISTS prices;

CREATE TABLE prices
(product_id INT NOT NULL
,book_type INT NOT NULL
,price DECIMAL(5,2) NOT NULL
,PRIMARY KEY(product_id,book_type)
);

INSERT INTO prices VALUES
(1,0,20.40),
(1,1,28.00),
(1,2,40.00),
(2,0,15.00),
(2,1,25.50),
(2,2,42.00),
(3,0,21.00),
(3,1,30.50),
(3,2,47.00);

SELECT c.*
     , a.*
  FROM prices a
  JOIN prices b
    ON b.product_id = a.product_id
  JOIN product c
    ON c.id = b.product_id
 WHERE b.price LIKE '%1%';
+----+-------------------+-------+------------+-----------+-------+
| id | title             | pages | product_id | book_type | price |
+----+-------------------+-------+------------+-----------+-------+
|  2 | Lord of the Rings |   950 |          2 |         0 | 15.00 |
|  2 | Lord of the Rings |   950 |          2 |         1 | 25.50 |
|  2 | Lord of the Rings |   950 |          2 |         2 | 42.00 |
|  3 | Game of Thrones   |   980 |          3 |         0 | 21.00 |
|  3 | Game of Thrones   |   980 |          3 |         1 | 30.50 |
|  3 | Game of Thrones   |   980 |          3 |         2 | 47.00 |
+----+-------------------+-------+------------+-----------+-------+
0 голосов
/ 19 января 2019

Я думаю, что вы можете делать то, что вы хотите с условной агрегацией:

select p.id, p.description, p.pages, p.title,
       max(case when pp.type = 0 then pp.value end) as ebook_price,
       max(case when pp.type = 1 then pp.value end) as impress_price,
       max(case when pp.type = 2 then pp.value end) as combo_price
from Produto p inner join
     Product_prices pp
     on p.id = pp.Product_id
where lower(p.title) like '%1%' 
group by p.id, p.description, p.pages, p.title;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...