以两个表为例:tbl_product和tbl_transaction。 tbl_product列出产品详细信息,包括名称和ID,同时tbl_transaction列出涉及产品的交易,包括日期,产品ID,客户等。
tbl_product
tbl_transaction
我需要显示一个网页,其中显示10个产品,每个产品的最近5个交易。到目前为止,LEFT JOIN如果mysql允许该tx.product_id=ta.product_id部分,则似乎没有任何查询有效,并且下面的子查询也可以工作( 在“ where子句”中 出现 Unknown列“ ta.product_id”的 失败 :[ERROR:1054] )。
LEFT JOIN
tx.product_id=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
当然这是非法的,但我真的希望不是这样!
这是排名函数非常有用的地方。不幸的是,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