Запрос не работает должным образом с LEFT JOIN (MySQL) - PullRequest
0 голосов
/ 26 сентября 2018

Я все еще борюсь с этой проблемой (мой предыдущий пост был об этом, и так как я изменил параметры таблицы, у меня есть другая проблема):

(некоторые столбцы изменились, поэтомуэто другая проблема / вопрос, так как у меня есть только поле id для получения последней вставки)

table products:

id  name
1   TV
2   RADIO
3   COMPUTER

table sales (product_id - это FK, который относится к продуктам):

id_sales    feedback    product_id
4           GOOD        2
5           GOOD        3
6           NICE        3

Используемый запрос:

SELECT products.name, sl.feed 
FROM products LEFT JOIN (
SELECT product_id, max(id_sales), feedback AS feed FROM sales GROUP BY product_id) sl
ON products.id = sl.product_id

Результат:

name         feed   
TV           NULL
RADIO        GOOD
COMPUTER     GOOD

Работает для телевидения и радио, но в столбцеКомпьютер, я должен показать ПОСЛЕДНЮЮ обратную связь, в которой видно, что это «Ницца», а не «ХОРОШО»!Использование SQL-функции MAX (id_sales) как-то не является решением, как я думал.Что мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

используйте подзапрос и оставьте соединение

select p.name,t1.feedback from products p
  left join
    (
    select t.id_sales,t.product_id,s.feedback 
       from
    (
    select max(id_sales) as id_sales,product_id from sales  
    group by product_id 
    ) t join sales s on  t.id_sales=s.id_sales
    ) t1 on p.id=t1.product_id
0 голосов
/ 26 сентября 2018

Лучший метод - row_number(), но он, вероятно, недоступен.Таким образом, вы можете отфильтровать самую последнюю дату в предложении ON:

SELECT p.name, sl.feed 
FROM products p LEFT JOIN
     sales s
     ON p.id = s.product_id AND
        s.id_sales = (SELECT MAX(s2.id_sales) FROM sales s2 WHERE s2.product_id = s.product_id);

Существуют альтернативные способы выражения этой логики.Одним из больших преимуществ этого подхода является то, что он может максимально использовать индексы для производительности.

0 голосов
/ 26 сентября 2018

SELECT products.name, sl.feed FROM products LEFT JOIN ( SELECT product_id, rank() over (partition by product_id Order by id_Sales desc) pRank, feedback AS feed FROM sales ) sl ON products.id = sl.product_id where sl.pRank = 1

Это работает для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...