【问题标题】:MYSQL limit the JOIN rowsMYSQL 限制 JOIN 行
【发布时间】:2017-11-03 19:16:26
【问题描述】:

我有 4 个表参与查询:

主表items 保存项目列表 suppliers 通过 id 保存项目供应商 INNER JOIN item_categories 按 id 保存项目类别 INNER JOIN

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

谢谢:)

【问题讨论】:

    标签: php mysql json join


    【解决方案1】:

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

           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

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

    【讨论】:

    • 如果您使用嵌套选择执行此操作,您可能还需要具体说明您从订单中选择哪些列而不是“*”
    • 我怎样才能让items.id 进入嵌套选择??
    猜你喜欢
    • 2010-09-14
    • 2012-08-06
    • 2012-04-26
    • 2013-02-20
    • 1970-01-01
    • 2018-09-02
    • 2013-04-07
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多