Using Variables
Setting Variables
Section titled “Setting Variables”Here are some ways to set variables:
EX: SET @var_string = 'my_var'; SET @var_num = '2' SET @var_date = '2015-07-20';
EX: Select @var := '123'; (Note: You need to use := when assigning a variable not using the SET syntax, because in other statements, (select, update...) the "=" is used to compare, so when you add a colon before the "=", you are saying "This is not a comparison, this is a SET".)
EX: SET @start_date = ‘2015-07-20’; SET @end_date = ‘2016-01-31’;
#this gets the year month value to use as the partition namesSET @start_yearmonth = (SELECT EXTRACT(YEAR_MONTH FROM @start_date));SET @end_yearmonth = (SELECT EXTRACT(YEAR_MONTH FROM @end_date));
#put the partitions into a variableSELECT GROUP_CONCAT(partition_name)FROM information_schema.partitions pWHERE table_name = 'partitioned_table'AND SUBSTRING_INDEX(partition_name,'P',-1) BETWEEN @start_yearmonth AND @end_yearmonthINTO @partitions;
#put the query in a variable. You need to do this, because mysql did not recognize my variable as a variable in that position. You need to concat the value of the variable together with the rest of the query and then execute it as a stmt.SET @query =CONCAT('CREATE TABLE part_of_partitioned_table (PRIMARY KEY(id))SELECT partitioned_table.*FROM partitioned_table PARTITION(', @partitions,')JOIN users u USING(user_id)WHERE date(partitioned_table.date) BETWEEN ', @start_date,' AND ', @end_date);
#prepare the statement from @queryPREPARE stmt FROM @query;#drop tableDROP TABLE IF EXISTS tech.part_of_partitioned_table;#create table using statementEXECUTE stmt;Row Number and Group By using variables in Select Statement
Section titled “Row Number and Group By using variables in Select Statement”Let’s say we have a table team_person as below:
+======+===========+| team | person |+======+===========+| A | John |+------+-----------+| B | Smith |+------+-----------+| A | Walter |+------+-----------+| A | Louis |+------+-----------+| C | Elizabeth |+------+-----------+| B | Wayne |+------+-----------+
CREATE TABLE team_person AS SELECT 'A' team, 'John' personUNION ALL SELECT 'B' team, 'Smith' personUNION ALL SELECT 'A' team, 'Walter' personUNION ALL SELECT 'A' team, 'Louis' personUNION ALL SELECT 'C' team, 'Elizabeth' personUNION ALL SELECT 'B' team, 'Wayne' person;To select the table team_person with additional row_number column, either
SELECT @row_no := @row_no+1 AS row_number, team, personFROM team_person, (SELECT @row_no := 0) t;OR
SET @row_no := 0;SELECT @row_no := @row_no + 1 AS row_number, team, personFROM team_person;will output the result below:
+============+======+===========+| row_number | team | person |+============+======+===========+| 1 | A | John |+------------+------+-----------+| 2 | B | Smith |+------------+------+-----------+| 3 | A | Walter |+------------+------+-----------+| 4 | A | Louis |+------------+------+-----------+| 5 | C | Elizabeth |+------------+------+-----------+| 6 | B | Wayne |+------------+------+-----------+Finally, if we want to get the row_number group by column team
SELECT @row_no := IF(@prev_val = t.team, @row_no + 1, 1) AS row_number ,@prev_val := t.team AS team ,t.personFROM team_person t, (SELECT @row_no := 0) x, (SELECT @prev_val := '') yORDER BY t.team ASC,t.person DESC;
+============+======+===========+| row_number | team | person |+============+======+===========+| 1 | A | Walter |+------------+------+-----------+| 2 | A | Louis |+------------+------+-----------+| 3 | A | John |+------------+------+-----------+| 1 | B | Wayne |+------------+------+-----------+| 2 | B | Smith |+------------+------+-----------+| 1 | C | Elizabeth |+------------+------+-----------+