如何从MySQL数据库中为每个列选择两个具有不同条件的列? 例如,让我们考虑一个表:

如何从MySQL数据库中为每个列选择两个具有不同条件的列? 例如,让我们考虑一个表:,mysql,mysql-5.6,Mysql,Mysql 5.6,假设我想选择两列。第一列应包含2019-09-11之前的所有名称,第二列应包含2019-09-11之后的所有名称。所以基本上,这两个柱有两个不同的where条件 预期产出将是: MySQL版本是5.6.34-log 有没有办法这样做 假设我想选择两列。第一列应包含所有 2019-09-11之前的名称和第二列应包含所有 2019-09-11之后的姓名。所以基本上会有两种不同的 其中,两列的条件 对RDMS的一点wierd请求。 无论如何,下面的查询没有经过测试,但我将使用两个子查询派生表和一个My

假设我想选择两列。第一列应包含2019-09-11之前的所有名称,第二列应包含2019-09-11之后的所有名称。所以基本上,这两个柱有两个不同的where条件

预期产出将是:

MySQL版本是5.6.34-log

有没有办法这样做

假设我想选择两列。第一列应包含所有 2019-09-11之前的名称和第二列应包含所有 2019-09-11之后的姓名。所以基本上会有两种不同的 其中,两列的条件

对RDMS的一点wierd请求。 无论如何,下面的查询没有经过测试,但我将使用两个子查询派生表和一个MySQL用户变量来生成一个行号,您可以在以后使用该行号进行连接

注 由于SQL是无序的,我在这里假设您不关心列中的排序

SELECT 
 *
FROM (
  SELECT 
    *
    , (@row_num1 := @row_num1 + 1) AS row_number    
  FROM  
   t  
  CROSS JOIN (SELECT @row_num1 := 0) AS init_user_param                  
  WHERE 
   `timestamp` < '2019-09-11'  
) AS left_column
LEFT/RIGHT JOIN (
  SELECT 
    *
    , (@row_num2 := @row_num2 + 1) AS row_number
  FROM  
   t
  CROSS JOIN (SELECT @row_num2 := 0) AS init_user_param                  
  WHERE 
   `timestamp` > '2019-09-11'  
) AS right_column
ON
 left_column.row_number = right_column.row_number

请参见

您的预期输出是什么样子的?你的MySQL版本是什么?您如何定义预期输出的顺序?请注意,数据是无序的,因此如果没有明确的排序定义,结果将是不确定的。您的MySQL服务器版本是什么?运行选择版本;在您的MySQL客户端PHPMyadmin、workbench等上,报告相同的结果。@MadhurBhaiya我已经附加了预期的输出,我的MySQL版本是5.6.34-Log。另外,回顾您的预期输出,顺序不一致。表中是否有主键?您计划如何处理此结果集?将其显示为报表上的状态?这将需要完全联接;因为我们不知道哪一边排得更多。此外,没有按数据排序将是不确定的,但考虑到OP本身对排序不清楚,因此可能会被忽略;因为我们不知道哪一边排得更多。理想情况下,是@MadhurBhaiya MySQL的EXEXUTE/PREPARE to the rescue,因为完整连接仿真在本例中测试时有点不确定。。此外,没有按数据排序将是不确定的,但考虑到OP本身不清楚排序,因此可以冒充我知道ANSI/ISO SQL标准排序默认值是不确定的,或者更好地说取决于平台。。。
SET @sql = CONCAT("
SELECT 
 *
FROM (
  SELECT 
    *
    , (@row_num1 := @row_num1 + 1) AS row_number
  FROM  
   t  
  CROSS JOIN (SELECT @row_num1 := 0) AS init_user_param                  
  WHERE 
   `timestamp` < '2019-09-11'  
) AS left_column
",

(
  SELECT 
   CASE
    WHEN left_column_count > right_column_count
    THEN 'LEFT JOIN'
    ELSE 'RIGHT JOIN' 
   END
  FROM (
    SELECT
         SUM(`timestamp` < '2019-09-11') AS left_column_count
       , SUM(`timestamp` > '2019-09-11') AS right_column_count
    FROM 
     t
  ) AS t
)                 

," (
  SELECT 
    *
    , (@row_num2 := @row_num2 + 1) AS row_number
  FROM  
   t
  CROSS JOIN (SELECT @row_num2 := 0) AS init_user_param                  
  WHERE 
   `timestamp` > '2019-09-11'  
) AS right_column
ON
 left_column.row_number = right_column.row_number
");


SELECT @sql; 
PREPARE s FROM @sql;
EXECUTE s;