Как ограничить результаты ЛЕВОГО СОЕДИНЕНИЯ

Возьмите случай двух таблиц: tbl_product и tbl_transaction.
tbl_product сведения о списках включая имена и идентификаторы, в то время как tbl_transaction транзакции списков, включающие продукты и, включают даты, идентификаторы продукта, клиенты и т.д.

Я должен отобразить веб-страницу, показывающую 10 продуктов и для каждого продукта, последние 5 транзакций. До сих пор, нет LEFT JOIN запрос, кажется, работает, и подзапрос ниже работал бы, если mysql мог бы позволить tx.product_id=ta.product_id часть (перестал работать со столбцом Unknown 'ta.product_id' в 'где пункт': [ERROR:1054]).

SELECT  
ta.product_id,  
ta.product_name,  
tb.transaction_date  
FROM tbl_product ta  
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx WHERE tx.product_id=ta.product_id LIMIT 5) tb
LIMIT 10

Существует ли способ достигнуть списка, в котором я нуждаюсь, не используя несколько запросов в цикле?

Править:
Это точно, в чем я нуждаюсь от MySQL:

SELECT ta.product_id, ta.product_name, tb.transaction_date ...  
FROM tbl_product ta  
LEFT JOIN tbl_transaction tb ON (tb.product_id=ta.product_id LIMIT 5)  
LIMIT 10

Конечно, это недопустимо, но мне действительно жаль, что это не было!

18
задан Manav 11 June 2014 в 07:25
поделиться

3 ответа

Здесь очень полезны функции ранжирования. К сожалению, MySQL пока не поддерживает их. Вместо этого вы можете попробовать что-то вроде следующего.

Select ta.product_id, ta.product_name
    , tb.transaction_date
From tbl_product As ta
    Left Join   (
                Select tx1.product_id, tx1.transaction_id, tx1.transaction_date
                    , (Select Count(*)
                        From tbl_transaction As tx2
                        Where tx2.product_id = tx1.product_id
                            And tx2.transaction_id < tx1.transaction_id) As [Rank]
                From tbl_transaction As tx1
                ) as tb
        On tb.product_id = ta.product_id
            And tb.[rank] <= 4
Limit 10
8
ответ дан 30 November 2019 в 09:30
поделиться

Edit:

Если вы хотите установить лимит на каждый продукт, я бы разделил его на два запроса.

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

0
ответ дан 30 November 2019 в 09:30
поделиться

Это не удается, потому что, когда вы заключили запрос в скобки и присвоили ему псевдоним «tb», вы создали производную таблицу. В производной таблице нет сведений о таблице tbl_product с псевдонимом «ta»

Попробуйте использовать ON или WHERE за пределами производной таблицы, а затем ссылайтесь на эту таблицу, используя указанный вами псевдоним «tb»

РЕДАКТИРОВАТЬ:

использование "LIMIT" ограничивает результаты запроса в целом. Хотя у вас есть «LIMIT 10», на самом деле вам нужно 50 строк (или меньше, если их меньше 5 исторических), правильно?

10 продуктов, соединенных с 5 историческими записями, возвращают всего 50 строк.

В этом случае у вас может быть единственное решение запроса, объединяющее таблицу продуктов с самой собой в производную таблицу с «LIMIT 10»

Например:

SELECT *
FROM tbl_product ta
JOIN (SELECT * FROM tbl_product tz WHERE tz.product_id = ta.product_id LIMIT 10) tc
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx 
    WHERE tx.product_id=ta.product_id LIMIT 5) tb

Вы также можете использовать «in» и указать верхнюю 10, например:

SELECT *
FROM tbl_product ta
LEFT JOIN (SELECT tx.transaction_date FROM tbl_transaction tx 
WHERE tx.product_id=ta.product_id LIMIT 5) tb 
WHERE ta.product_id IN 
  (SELECT z.product_id FROM tbl_product z LIMIT 10)
3
ответ дан 30 November 2019 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: