2017-11-03 9 views
0

I'vは、4つのテーブルがクエリに関与しました:MYSQL JOINを行を制限

メインテーブルitemsは、項目のリストを保持しているアイテムのカテゴリINNER JOINを保持しているINNERは、ID item_categoriesにより、JOINアイテムサプライヤーを保持している suppliers id

およびorders次の構造体で注文を保持するテーブル id 。 。 。 items =>順番にJSON項目の

例をitems配列を保持するJSON:

私は最後の4桁量

私にすべてのアイテムのテーブルを取得したい

{ 
"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" 
}} 

メイクにこのクエリ疥癬:

 

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` 
 

全てラストオーダーと私にすべてのアイテムを与える

私の最終的な質問は、私が左ジョイントで得た結果を制限することができる方法はありますか?

感謝:)

答えて

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文。私がより良い方法を考えるなら編集します。

EDIT:

あなたがランクへのアクセス権を持っている場合はそれがまた動作しますように、それが見えます。出典:

How to limit results of a LEFT JOIN

ランクはあなたに利用可能である場合は、ネストされたでそれを行う場合はそれがおそらくより良いオプション

+0

であなたもあなたの代わりに注文から選択された列について特定する必要があるかもしれない選択'*' – wahyzcrak

+0

どうすれば 'items'.idをネストされたselectに得ることができますか? –