Допустим, я хочу выбрать два столбца.Первый столбец должен содержать все имена до 2019-09-11, а второй столбец должен содержать все имена после 2019-09-11.Таким образом, в принципе, для двух столбцов будет два разных условия:
Немного странный запрос на СУРД.В любом случае приведенный ниже запрос не тестировался, но я бы использовал два подзапроса (производные таблицы) с пользовательской переменной MySQL для генерации row_number, который можно использовать для последующего присоединения ..
note AsSQL упорядочен, я предполагаю, что здесь вам не нужна сортировка в столбцах.
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
Комментарий Мадхур Бхайя Это потребует ПОЛНОГО СОЕДИНЕНИЯ;потому что мы не знаем, на какой стороне больше строк.
Совершенно верно, вам нужно использовать LEFT JOIN, если левый столбец содержит больше записей.И RIGHT JOIN, когда правый столбец содержит больше записей.
Так как это в любом случае странный запрос, я бы предложил использовать язык программирования или MySQL PREPARE/EXECUTE
для построения динамического запроса, поэтому эмуляция FULL JOIN не требуется ..
Предупреждение при использовании EXECUTE/ ПОДГОТОВИТЬ в MySQL к генерации динамического 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;
см. демо