22

以两个表为例:tbl_producttbl_transaction
tbl_product列出产品详细信息,包括名称和 ID,同时tbl_transaction列出涉及产品的交易,包括日期、产品 ID、客户等。

我需要显示一个显示 10 种产品的网页,以及每种产品的最后 5 笔交易。到目前为止,LEFT JOIN似乎没有任何查询有效,如果 mysql 可以允许该tx.product_id=ta.product_id部分,则下面的子查询将有效(在 'where 子句': [ERROR:1054] 中出现 Unknown column 'ta.product_id'失败)。

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

当然这是非法的,但我真的希望它不是!

4

4 回答 4

9

这是排名函数非常有用的地方。不幸的是,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
于 2010-07-27T23:55:18.783 回答
3

它失败了,因为当您在查询周围加上括号并为其赋予别名“tb”时,您已经创建了一个派生表。您的派生表不知道具有别名“ta”的 tbl_product 表

尝试在派生表之外使用 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

您也可以我们“进入”并指定前 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)
于 2010-07-27T23:15:48.343 回答
1

我找到了使用子查询进行 LEFT JOIN 的方法,排序和限制,它在 RDS Amazon,MariaDB v10.2 上工作

LEFT JOIN activities last_activity ON last_activity.id = ( 
     SELECT id FROM activities 
     WHERE contester_id = contesters.id AND `type` IN ({$last_activity_types}) 
     ORDER BY id DESC LIMIT 1 
)

使用 GROUPING 和 SORTING 进行 LEFT JOIN 的所有其他方法都不适用于我。这个例子是工作异常。

于 2018-12-12T10:04:19.833 回答
0

编辑:

如果您想对每种产品实施限制,我会将其分成两个查询。

首先获取 10 个产品的列表,然后对返回最后 5 个交易的每个产品运行另一个查询。

于 2010-07-27T23:19:27.647 回答