Как выбрать два столбца, имеющих разные условия для каждого столбца из базы данных MySQL? - PullRequest
0 голосов
/ 27 сентября 2019

Например, давайте рассмотрим таблицу типа:

enter image description here

Допустим, я хочу выбрать два столбца.Первый столбец должен содержать все имена до 2019-09-11, а второй столбец должен содержать все имена после 2019-09-11.Таким образом, в принципе, будет два разных условия для двух столбцов.

ожидаемый результат будет:

enter image description here

Версия MySQL 5.6.34-log

В любом случае, сделать это?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Допустим, я хочу выбрать два столбца.Первый столбец должен содержать все имена до 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;

см. демо

0 голосов
/ 27 сентября 2019

Вы можете попробовать: SELECT (имя SELECT из таблицы WHERE your_condition) как col1, (имя SELECT из таблицы WHERE your_condition) как col2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...