2013-05-30 24 views
2

比方說,我有一個像有沒有辦法通過一個計算值,而不在另一個選擇包裝它來過濾?

SELECT ID, Name, SUM(qty * price) as Value 
FROM Docs 
WHERE Name like '%something%' OR Value like '%something%' 
GROUP BY ID, Name 

表格文檔包括每個產品的記錄是外出庫存作爲這樣的一個簡單的查詢:

ID: the id of the document through which the product was released from the inventory (for example an invoice or a delivery note) 
Name: the name of the document 
qty: the number of units that were released 
price: the unit price of the product in said inventory 

(實際的表是一個很大的較複雜,但我簡化了很多爲清楚起見)

正如你可以看到我已經張貼的查詢是地毯式搜索。我想列出所有文檔的ID,名稱和總值,其名稱或值與某些用戶輸入相同。但是我實際上不能使用WHERE子句中的Value列。

我可以把它包在另一個select * FROM()並做了搜索。但是我必須處理的查詢要複雜得多,並且以這種方式改變它會是一個很大的麻煩。

有什麼辦法避免纏繞整個查詢,如果我想要做這種搜索的?

+0

你明白這個名字的過濾會影響總和的價值? –

+0

是啊,我得更改查詢了一下,我的忘了該組。 – Bogdan

回答

1

威爾HAVING做同樣的事情?

SELECT ID, Name, SUM(qty * price) as Value 
FROM Docs 
HAVING Value like '%something%' OR Name like '%something%' 
+0

這實際上是一個非常好的想法。我不必改變查詢的搜索部分的計算方式,只是搜索列的一些名稱。我會試試看看它是如何發展的。 – Bogdan

+0

好吧,我從WHERE子句中刪除了查詢的一攬子搜索部分,以添加一個新增的HAVING子句。它測試了一點慢,但它很好地工作,很容易實現。非常感謝。 – Bogdan

+0

你不止歡迎 – dKen

1

讓我們嘗試

SELECT ID, Name, SUM(qty * price) as Value 
FROM Docs 
having Value like '%something%' or Name like '%something%' 
+0

使用將會消除一些有效的行(主要是那些名稱是有點但沒有價值的那些) – Bogdan

+0

是的,現在正在嘗試。 – Bogdan

1

如果你不想讓UNION 「從選擇中選擇」 可以幫助你:這個

(SELECT ID, Name, SUM(qty * price) as Value 
FROM Docs 
WHERE Name like '%something%') 
UNION 
(SELECT ID, Name, SUM(qty * price) as Value 
FROM Docs 
HAVING SUM(qty * price) like '%something%') 
+0

儘管這樣可以避免從select中選擇,但它帶來了很多相同的問題。我必須處理的查詢是巨大的,它的每個部分都是根據很多因素分別計算的,將select改爲union意味着我在改變所有查詢計算函數方面做了很多工作,這就是我試圖避免 – Bogdan

0
SELECT ID, Name, SUM(qty * price) as Value 
FROM Docs 
WHERE Name like '%something%' OR Value like '%something%' 
GROUP BY ID, Name 

唯一的問題查詢是MySQL做n的不允許在WHERE子句中使用別名。

所以,你可以簡單的重複計算在WHERE子句中,它應該工作:

不要擔心在查詢中具有兩倍相同的計算 - 查詢優化器應該認識到,仍然只計算一次該值。

(並且順便說一句,在數值使用LIKE似乎有點兒奇怪 - 其他比較符如=<>可能更合適。)

+0

我嘗試使用where子句中的計算,但是這會導致錯誤。此外,使用類似的唯一原因是保持均勻性,以便我們的客戶不知道整數和字符串字段之間的差異,並希望一攬子搜索對每個字段都起作用。當客戶想要找到一個文檔/客戶端/無論在其值/餘額中有多少位數字的情況下,這也有幫助。我們有更具體的搜索,我們使用<, >和=,但這是一個一般的全面搜索。 – Bogdan

相關問題