如何从MySQL数据库中为每个列选择两个具有不同条件的列? 例如,让我们考虑一个表:
假设我想选择两列。第一列应包含2019-09-11之前的所有名称,第二列应包含2019-09-11之后的所有名称。所以基本上,这两个柱有两个不同的where条件 预期产出将是: MySQL版本是5.6.34-log 有没有办法这样做 假设我想选择两列。第一列应包含所有 2019-09-11之前的名称和第二列应包含所有 2019-09-11之后的姓名。所以基本上会有两种不同的 其中,两列的条件 对RDMS的一点wierd请求。 无论如何,下面的查询没有经过测试,但我将使用两个子查询派生表和一个MySQL用户变量来生成一个行号,您可以在以后使用该行号进行连接 注 由于SQL是无序的,我在这里假设您不关心列中的排序如何从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
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;