我試圖找到邏輯或方法,我應該怎么做才能找到最接近的值
像這樣存盤資料
| ID | 位置 ID | item_id | 批 | 過期日期 | 數量 | 挑選 | 放 | 托盤 | 位置型別 |
|---|---|---|---|---|---|---|---|---|---|
| 21 | M-16-10 | 1 | 092021 | 2024-08-16 | 8 | 0 | 0 | 1001 | 挑選 |
| 22 | M-16-10 | 1 | 092021 | 2024-08-16 | 52 | 0 | 0 | 1002 | 挑選 |
| 23 | K-15-60 | 1 | 092021 | 2024-08-17 | 42 | 0 | 0 | 1003 | 架子 |
| 24 | K-17-50 | 1 | 092021 | 2024-08-18 | 32 | 0 | 0 | 1004 | 架子 |
| 25 | K-20-60 | 1 | 092021 | 2024-08-19 | 33 | 0 | 0 | 1005 | 架子 |
| 26 | K-24-60 | 1 | 092021 | 2024-08-20 | 42 | 0 | 0 | 1006 | 架子 |
| 27 | K-26-40 | 1 | 092021 | 2024-08-21 | 22 | 0 | 0 | 1007 | 架子 |
| 28 | K-27-20 | 1 | 092021 | 2024-08-22 | 32 | 0 | 0 | 1008 | 架子 |
| 29 | K-32-40 | 1 | 092021 | 2024-08-23 | 12 | 0 | 0 | 1009 | 架子 |
像這樣的訂單資料
| ID | 杰出的 | item_id |
|---|---|---|
| 1 | 42 | 1 |
和這樣的代碼
$xsql = Storage::select('storages.*')
->selectRaw("min(qty) as min_qty")
->where('item_id', $outstanding->item_id)
->whereRaw('(qty-pick) <= ?',[$outstanding->outstanding])
->whereRaw('qty-pick>0')
->orderBy('exp_date', 'asc')
->orderByRaw('abs((qty-pick)-"'.$outstanding->outstanding.'")')
->groupBy('id')
->first();
如果我轉儲的查詢
SELECT
*
FROM
storages
WHERE
item_id = 1
AND qty - pick > 0
AND qty - pick <= 42
GROUP BY
id
ORDER BY
exp_date ASC,
abs( ( qty - pick ) - 42 )
如果我使用此代碼執行,我會得到錯誤的結果 當前結果
| ID | 位置 ID | item_id | 批 | 過期日期 | 數量 | 挑選 | 放 | 托盤 | 位置型別 |
|---|---|---|---|---|---|---|---|---|---|
| 23 | K-15-60 | 1 | 092021 | 2024-08-17 | 42 | 0 | 0 | 1003 | 架子 |
系統顯示的第一行是Storage ID 23而不是21(exp date storage id 21比storage id 23接近exp),如何組合按exp_date asc排序和按離未完成值最近的值排序?
我的預期結果是這樣的
| ID | 位置 ID | item_id | 批 | 過期日期 | 數量 | 挑選 | 放 | 托盤 | 位置型別 |
|---|---|---|---|---|---|---|---|---|---|
| 21 | M-16-10 | 1 | 092021 | 2024-08-16 | 8 | 0 | 0 | 1001 | 挑選 |
uj5u.com熱心網友回復:
一種可能性是使用 LIMIT:
SELECT *
FROM storages
WHERE item_id = 1 AND qty - pick BETWEEN 1 AND 42
ORDER BY exp_date ASC
LIMIT 1
這將是連接具有突出值的表的解決方案:
SELECT storages.*
FROM storages
JOIN outstanding USING (item_id)
WHERE outstanding.item_id = 1
AND qty - pick BETWEEN 1 AND outstanding.outstanding
ORDER BY exp_date ASC
LIMIT 1
這將為您提供未完成的所有行的結果:
SELECT storages.*
FROM storages
JOIN outstanding USING (item_id)
WHERE qty - pick BETWEEN 1 AND outstanding.outstanding
GROUP BY outstanding.item_id
ORDER BY exp_date ASC
參見示例sqlfiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367067.html
上一篇:如何通過html表單和javascript呼叫laravel的destroy函式?
下一篇:洗掉搜索詞后顯示所有內容
