MYSQL限制JOIN行

时间:2017-11-03 19:16:27

标签: php mysql json join

我在查询中涉及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得到的结果?

谢谢:)

1 个答案:

答案 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

如果您可以使用等级,这可能是更好的选择