3

私はこのようなコードを持っています。

DELIMITER $$
    CREATE PROCEDURE `sp_deleteOrderData`(orderid BIGINT(11))
    BEGIN
        DECLARE shipmentnumbers VARCHAR(1000);
        DECLARE cartonid VARCHAR(1000);

        SELECT GROUP_CONCAT(a_shipmentid) FROM t_shipment WHERE a_orderid = orderid INTO shipmentnumbers;

        SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE a_shipmentid IN (shipmentnumbers) INTO cartonid;

    SELECT shipmentnumbers;
    /*SELECT  cartonid;  */
    END$$

    DELIMITER ;

ここでshipmentnumbersが返されます100020,100021,100022 理想的にはcartonidは次のように返されるべきです11,12,13

しかし、私はカートニッドとして11しか得られません。

しかし、以下のコードを使用すると、適切な結果が得られます。

  SELECT GROUP_CONCAT(a_cartonid) FROM t_carton WHERE FIND_IN_SET( a_shipmentid, shipmentnumbers ) INTO cartonid;

INとFIND_IN_SETの違いを正確に知りたいのですが、何を使用するかを決定します。

4

2 に答える 2

2

IN検索するリストまたはパラメーターをFIND_IN_SET受け入れ、コンマ区切りのリストを含む文字列パラメーターを受け入れます。

SELECT  1 IN (1, 2, 3, 4)

SELECT  FIND_IN_SET(1, '1,2,3,4')

カンマ区切りの文字列に適用しようとするINと、単一のパラメータとして扱われ、全体として一致します。

SELECT  1 IN ('1,2,3,4')

もちろん、文字列'1'は文字列と等しくない'1,2,3,4'ため、上記のクエリはfalseを返します。

于 2013-03-27T10:36:29.407 に答える
1

FIND_IN_SETカンマで区切られた文字列のセット内の文字列を検索します。

ただし、句でGROUP_CONCAT使用する行を連結するためにを使用する必要はありません。これを試してください。IN

SELECT  GROUP_CONCAT(a_cartonid) 
FROM    t_carton
WHERE   a_shipmentid IN
         (
            SELECT a_shipmentid
            FROM t_shipment 
            WHERE a_orderid = orderid
         )

または使用するJOIN

SELECT  GROUP_CONCAT(DISTINCT a.a_cartonid) 
FROM    t_carton a
        INNER JOIN
        (
            SELECT a_shipmentid
            FROM t_shipment 
            WHERE a_orderid = orderid
        ) b ON a.a_shipmentid = b.a_shipmentid
于 2013-03-27T10:36:28.767 に答える