GROUP_CONCAT作为MySQL函数的输入

时间:2015-03-04 19:41:57

标签: mysql

是否可以在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 ;

3 个答案:

答案 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,然后使用prepareexecute