2

假设我有一个简单的查询,例如

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

表 Docs 记录了从库存中出库的每种产品,如下所示:

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 ()并对其进行搜索。但是我必须处理的查询要复杂得多,以这种方式更改它会很麻烦。

如果我想做这种搜索,有什么方法可以避免包装整个查询?

4

4 回答 4

1

HAVING会做同样的事情吗?

SELECT ID, Name, SUM(qty * price) as Value
FROM Docs
HAVING Value like '%something%' OR Name like '%something%'
于 2013-05-30T12:04:22.520 回答
1

我们试试看

SELECT ID, Name, SUM(qty * price) as Value
FROM Docs 
having Value like '%something%' or Name like '%something%' 
于 2013-05-30T12:05:42.127 回答
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%')
于 2013-05-30T12:06:44.860 回答
0
SELECT ID, Name, SUM(qty * price) as Value
FROM Docs 
WHERE Name like '%something%' OR Value like '%something%'
GROUP BY ID, Name

这个查询的唯一问题是 MySQL 不允许在 WHERE 子句中使用别名。

因此,您可以简单地在 WHERE 子句中重复计算,它应该可以工作:

WHERE Name like '%something%' OR SUM(qty * price) like '%something%'

不要担心在您的查询中有两次相同的计算 - 查询优化器应该认识到这一点并且仍然只计算一次该值。

(顺便说一句,在数值上使用 LIKE 似乎有点奇怪 - 其他比较运算符,如,=可能更合适。)<>

于 2013-05-30T12:39:32.477 回答