以两张桌子为例:tbl_product
和tbl_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
当然这是非法的,但我真的希望不是!
答案 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的所有其他方式对我不起作用。这个例子是工作异常。