簡體   English   中英

mysql存儲過程查詢建議

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM