multiple values in mysql variable

后端 未结 6 2021
渐次进展
渐次进展 2021-02-05 13:49

The following works as expected when there is a single value stored in a variable.

SET @a := \"20100630\";
SELECT * FROM wordbase WHERE verified = @a;


        
相关标签:
6条回答
  • 2021-02-05 13:57

    Using GROUP_CONCAT and GROUP BY one could pull all values ( i.e. an id ) into a variable like so:

    SET @var := (SELECT GROUP_CONCAT(id) FROM `table` WHERE `verified` = @verified GROUP BY verified);
    
    0 讨论(0)
  • 2021-02-05 13:59

    Something like this should work. Is it ok to use prepared statements to create temporary tables like this?

    SET @a := "'20100630', '20100701'";
    SET @sql = CONCAT('create temporary table pn1 SELECT * FROM wordbase WHERE verified IN (', @a, ')');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    
    select * from pn1;
    
    0 讨论(0)
  • 2021-02-05 13:59

    FIND_IN_SET(column to find in , string csv) is a very handy method in case you have the string list of CSV:

    SET @a := "'20100630', '20100701' ";
    SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
    

    if your variable is also coming from query then use this to set @a

    SET @a := (SELECT GROUP_CONCAT(`id`) FROM `table`);
    
    0 讨论(0)
  • 2021-02-05 14:02
    SELECT GROUP_CONCAT(field_table1 SEPARATOR ',') FROM table1 into @var;
    

    then

    SELECT * FROM table2 WHERE field_table2 in(@var);
    

    works fine for me

    0 讨论(0)
  • 2021-02-05 14:17

    You cannot (as far as I am aware) store multiple values in a MySQL user defined variable. What you have done is create a string which contains:

    '20100630', '20100701'
    

    That is not two separate values, but a single string value, just as this is a single string value:

    SET @a := "It's a single string, and that's the problem";
    

    You need to use two separate variables, or prepare a statement, like this:

    SET @a := "20100630";
    SET @b := "20100701";
    
    SET @sql = CONCAT(
        'SELECT * FROM wordbase WHERE verified IN (',
        @a,
        ',',
        @b,
        ')'
    );
    
    
    SELECT @sql;
    +--------------------------------------------------------------+
    | @sql                                                         |
    +--------------------------------------------------------------+
    | SELECT * FROM wordbase WHERE verified IN (20100630,20100701) |
    +--------------------------------------------------------------+
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    

    But that's kinda messy. Why do you need to use variables?

    0 讨论(0)
  • 2021-02-05 14:20

    There's good solution described here: https://stackoverflow.com/a/11957706/1523961

    So can use something like this:

    SET @a := '20100630,20100701';
    SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
    

    Also, if you're selecting the ids for @a from another table, you can come up with following:

    SET @a := (SELECT GROUP_CONCAT(id) FROM someTable where yourBooleanExpressionHere);
    SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a);
    
    0 讨论(0)
提交回复
热议问题