如何限制LEFT JOIN的结果

时间:2010-07-27 23:08:10

标签: mysql sql subquery left-join mysql-error-1054

以两张桌子为例:tbl_producttbl_transaction tbl_product列出了产品详细信息,包括姓名和ID,tbl_transaction列出了涉及产品的交易,包括日期,产品ID,客户等。

我需要显示一个显示10个产品和每个产品的网页,最后5个交易。到目前为止,没有LEFT JOIN查询似乎有效,如果mysql允许tx.product_id=ta.product_id部分,则下面的子查询将起作用(在'where子句'中未知列'ta.product_id'失败: [错误: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

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

4 个答案:

答案 0 :(得分:8)

这是排名函数非常有用的地方。不幸的是,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

答案 1 :(得分:2)

它失败了,因为当你在查询周围添加括号并给它别名“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)

答案 2 :(得分:0)

编辑:

如果您想对每种产品强制执行限制,我会将其分为两个查询。

首先获取10个产品的列表,然后为返回最后五个事务的每个产品运行另一个查询。

答案 3 :(得分:0)

我找到了通过子查询进行排序和限制的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的所有其他方式对我不起作用。这个例子是工作异常。