是否可以在SELECT中使用GROUP_CONCAT作为MySQL函数的输入?我似乎无法弄清楚如何施放变量。我试过blob。我已尝试过文字(然后使用其他功能将其分解为结果集here),但我没有取得任何成功。
我想这样用:
SELECT
newCustomerCount(GROUP_CONCAT(DISTINCT items.invoicenumber)) AS new_customers
FROM items;
这是功能:
DROP FUNCTION IF EXISTS newCustomerCount;
DELIMITER $$
CREATE FUNCTION newCustomerCount(invoicenumbers BLOB)
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE new_customers INT;
SET new_customers = 0;
SELECT
SUM(nc.record) INTO new_customers
FROM (
SELECT
1 AS customer,
(SELECT COUNT(*) FROM person_to_invoice ps2 WHERE person_id = ps1.person_id AND invoice < ps1.invoice) AS previous_invoices
FROM person_to_invoice ps1
WHERE invoice IN(invoicenumbers)
HAVING previous_invoices = 0
) nc;
RETURN new_customers;
END$$
DELIMITER ;
答案 0 :(得分:1)
您可以尝试FIND_IN_SET()而不是IN()。传递一长串发票号码时,表现可能会很糟糕。但它应该有用。
WHERE FIND_IN_SET(invoice, invoicenumbers)
答案 1 :(得分:1)
由于Mysql函数不支持动态查询,我建议您重新考虑将基本策略传递给函数列表。相反,您可以修改您的功能以接受单个发票编号,并返回仅为一个发票编号的新客户数。
此外,您可以在查询中进行一些优化,以查找新客户的数量。
DROP FUNCTION IF EXISTS newCustomerCount;
DELIMITER $$
CREATE FUNCTION newCustomerCount(p_invoice INT)
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE new_customers INT;
SET new_customers = 0;
SELECT
COUNT(DISTINCT ps1.person_id) INTO new_customers
FROM
person_to_invoice ps1
WHERE
ps1.invoice = p_invoice
AND NOT EXISTS (
SELECT 1
FROM person_to_invoice ps2
WHERE ps1.person_id = ps2.person_id
AND ps2.invoice < ps1.invoice
);
RETURN new_customers;
END$$
DELIMITER ;
然后,您仍然可以获得给定发票号码列表的新客户总数,如下所示:
SELECT
SUM(newCustomerCount(invoice)) as total_new_customers
FROM items
WHERE ...
答案 2 :(得分:0)
你看错了地方。
WHERE invoice IN(invoicenumbers)
不会进行所需的替换。相反,您需要使用CONCAT
来构建SQL,然后使用prepare
和execute
。