[英]mysql stored procedure query advice
我有一個存儲過程,需要一些參數,其中一個參數是“汽車名稱”列表。 例如
CALL `car_list_inventory`(1,"'Honda','Nissan','BMW','Toyota'");
存儲過程的結果返回當前可用的汽車名稱的名稱,例如,如果我要運行該過程,結果將是
store cars_available
---- ----------------
1 Honda, BMW
確定可用汽車的查詢的一部分是
SELECT store, GROUP_CONCAT(DISTINCT cars.model) AS cars_available
FROM cars
JOIN cars_avail ON cars.id = cars_avail.id_ref
WHERE cars.id = LAST_INSERT_ID();
我想做的是添加第二部分,該部分將返回不可用的汽車,例如,整個結果應類似於
store cars_available cars_not_available
----- ---------------- ----------------
1 Honda, BMW Nissan, Toyota
這可能嗎?
要獲得不可用的汽車:
SELECT store, GROUP_CONCAT(DISTINCT cars.model) AS cars_not_available
FROM cars
LEFT JOIN cars_avail ON cars.id = cars_avail.id_ref
WHERE cars_avail.id_ref IS NULL
GROUP BY store
您還可以使用NOT IN
:
SELECT store, GROUP_CONCAT(DISTINCT cars.model) AS cars_not_aveilable
FROM cars
WHERE id NOT IN (SELECT id_ref FROM cars_avail)
GROUP BY store
要在一個查詢中同時獲取兩者,您可以執行以下操作:
SELECT store,
GROUP_CONCAT(CASE WHEN cars_avail.id_ref IS NOT NULL
THEN cars.model
END) AS cars_available,
GROUP_CONCAT(CASE WHEN cars_avail.id_ref IS NULL
THEN cars.model
END) AS cars_not_available
FROM cars
LEFT JOIN cars_avail ON cars.id = cars_avail.id
GROUP BY store
您正在嘗試使問題適合您已經選擇的API-這是找到解決方案的錯誤方法。 尤其是當您試圖打破關系數據庫的基本規則之一時:一個屬性(在這種情況下為過程參數)絕不能包含多個值。
使用SQL解決變量參數列表問題的正確方法是將值列表放入表中並進行聯接。 您可能會通過解析單個字符串以拆分出值來實現此目的,但是我猜您沒有向用戶提供原始的MySQL訪問權限-因此,從用於橋接訪問權限的任何內容進行插入操作要簡單得多,然后....
INSERT INTO search (session, model, created)
VALUES
(CONNECTION_ID(), 'Honda', NOW()),
(CONNECTION_ID(), 'Nissan', NOW()),
(CONNECTION_ID(), 'BMW', NOW()),
(CONNECTION_ID(), 'Toyota', NOW());
SELECT store, SUM(IF(cars.model IS NULL, 0, 1)) AS matches,
GROUP_CONCAT(cars.model) AS available,
GROUP_CONCAT(IF(cars.model IS NULL, search.models, NULL)) AS notavailable
FROM search
LEFT JOIN cars
ON search.model=cars.model
AND cars,stock>0
WHERE search.session=CONNECTION_ID()
GROUP by store
ORDER BY matches;
DELETE FROM search
WHERE session=CONNECTION_ID();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.