我在查询中涉及4个表:
主表items
包含项目列表
{id}持有项目供应商INNER JOIN的suppliers
{id}保存项目类别INNER JOIN的item_categories
和orders
表:
id
。
。
。
items
=>一个按顺序包含items数组的JSON
项目JSON的例子:
{
"10": {
"name": "item 1",
"step": "1",
"price": "140",
"amount": "4"
},
"24": {
"name": "item 2",
"step": "1",
"price": "6.2",
"amount": "1"
},
"35": {
"name": "item 3",
"step": "1",
"price": "2.9",
"amount": "3"
},
"37": {
"name": "item 4",
"step": "1",
"price": "3.9",
"amount": "2"
}}
我想获得最后4个订单金额的所有项目的表格
我管理了这个查询:
SELECT
`items`.`id`,
`items`.`part_number`,
`item_categories`.`name` AS category,
`suppliers`.`name` AS supplier,
`items`.`supplier_id`,
`items`.`name`,
`items`.`inventory`,
`items`.`package_items`,
`items`.`order_step`,
`items`.`price`,
`items`.`discount`,
`items`.`scale`,
`items`.`by_scale`,
`items`.`has_tax`,
`items`.`category_id`,
`items`.`enable`,
Group_concat(Json_extract(`orders`.`items`, Concat('$."', `items`.`id`, '".amount')) ORDER BY
`orders`.`createdate` DESC) AS last_orders_amount
FROM `items`
INNER JOIN `suppliers`
ON `items`.`supplier_id` = `suppliers`.`id`
INNER JOIN `item_categories`
ON `items`.`category_id` = `item_categories`.`id`
LEFT JOIN `orders`
ON
Json_extract(`orders`.`items`, Concat('$."', `items`.`id`, '"')) IS
NOT NULL
WHERE 1
GROUP BY `items`.`id`
给我包含所有最后订单的所有项目
所以我的最后一个问题是,有没有一种方法可以限制LEFT JOIN得到的结果?
谢谢:)
答案 0 :(得分:0)
一种简单的方法,但可能不理想的是:
LEFT JOIN (SELECT * FROM `orders` LIMIT 1000) ordrs
ON
Json_extract(`ordrs`.`items`, Concat('$."', `items`.`id`, '"')) IS
NOT NULL
WHERE 1
GROUP BY `items`.`id`
所以基本上只是将select语句嵌套为连接表。如果我想到更好的方法,我会编辑。
编辑:
如果您有权访问排名,看起来也会有效。来源:
How to limit results of a LEFT JOIN
如果您可以使用等级,这可能是更好的选择