繁体   English   中英

MYSQL限制JOIN行

[英]MYSQL limit the JOIN rows

我在查询中涉及4个表:

主表items持有项目列表suppliers持有该项目的供应商通过INNER JOIN ID item_categories持有项目类别由INNER JOIN ID

以及在以下结构中保存订单的orders表: id items =>一个JSON,用于按顺序保存items数组

项目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获得的结果?

谢谢 :)

一种简单的方法(但可能不理想)是:

       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语句作为您的联接表。 如果我认为有更好的方法,将进行编辑。

编辑:

如果您有权获得排名,那么看起来也可以使用。 资源:

如何限制左联接的结果

如果您可以使用排名,那可能是更好的选择

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM