Несоответствие выбора столбца объединения

#mysql #select #union

#mysql #выберите #объединение

Вопрос:

Вот мой запрос:

 SELECT
    FROM_UNIXTIME( date_added,  '%m-%d-%Y' ) AS formatted_date,
    SUM( tb =1 ) AS sum_users,
    SUM( tb =2 ) AS sum_links,
    SUM( tb =3 ) AS sum_ads,
    SUM( tb =4 ) AS sum_actions
FROM (
    SELECT date_added, 1 AS tb
        FROM users_list WHERE 1=1
    UNION ALL 
    SELECT date_added, 2
        FROM users_links WHERE 1=1
    UNION ALL 
    SELECT date_served, 3
        FROM ads_served WHERE 1=1
    UNION ALL 
    SELECT date_served, 4
        FROM actions WHERE 1=1
) AS t
GROUP BY formatted_date
ORDER BY formatted_date DESC
  

Вот данные моей таблицы:

users_list

 id    date_added
1     1234567890
2     1334567890
3     1434567890
  

ссылки пользователей

 id    date_added
1     1244567890
2     1354567890
3     1464567890
  

ads_served

 id    date_served    revenue
1     1234567891     0.01
2     1334567892     0.02
3     1434567893     0.02
  

Действия

 id    date_served
1     1234561890
2     1334562890
3     1434563890
  

Я пытаюсь суммировать доход для formatted_date в таблице ads_served в качестве 6-го столбца для выходного запроса. Я не знаю, с чего начать. Если я добавляю сумму (доход) к выбранному объединению, я получаю ошибку «несоответствие столбцов».

Ответ №1:

Столбец revenue принадлежит ads_served , но вы выбираете из подзапроса, где revenue его нет. Добавьте его в подзапрос:

 SELECT
    FROM_UNIXTIME( date_added,  '%m-%d-%Y' ) AS formatted_date,
    SUM( tb =1 ) AS sum_users,
    SUM( tb =2 ) AS sum_links,
    SUM( tb =3 ) AS sum_ads,
    SUM( tb =4 ) AS sum_actions,
    SUM( revenue ) As sum_revenue
FROM (
    SELECT date_added, 1 AS tb, 0 As revenue
        FROM users_list WHERE 1=1
    UNION ALL 
    SELECT date_added, 2, 0
        FROM users_links WHERE 1=1
    UNION ALL 
    SELECT date_served, 3, revenue
        FROM ads_served WHERE 1=1
    UNION ALL 
    SELECT date_served, 4, 0
        FROM actions WHERE 1=1
) AS t
GROUP BY formatted_date
ORDER BY formatted_date DESC
  

Комментарии:

1. спасибо за ваш ответ. к сожалению, вы опоздали на 2 минуты. проголосовал за вашу помощь.

Ответ №2:

Попробуйте таким образом. Почему вы используете 1 = 1?

 SELECT
    FROM_UNIXTIME( date_added,  '%m-%d-%Y' ) AS formatted_date,
    SUM( tb =1 ) AS sum_users,
    SUM( tb =2 ) AS sum_links,
    SUM( tb =3 ) AS sum_ads,
    SUM( tb =4 ) AS sum_actions,
    sum(total) as tot_rev
FROM (
    SELECT date_added,'' as total, 1 AS tb
        FROM users_list WHERE 1=1
    UNION ALL 
    SELECT date_added,'', 2
        FROM users_links WHERE 1=1
    UNION ALL 
    SELECT date_served,revenue, 3
        FROM ads_served WHERE 1=1
    UNION ALL 
    SELECT date_served,'', 4
        FROM actions WHERE 1=1
) AS t
GROUP BY formatted_date
ORDER BY formatted_date DESC
  

Комментарии:

1. кстати, после «как итого» должна быть запятая

2. Я забыл отредактировать, ГДЕ 1 = 1, ради этого примера. В коде к каждому оператору SELECT применяются фильтры. Я использую «1 = 1», чтобы гарантировать, что следующий фильтр будет иметь «и» впереди, чтобы упростить применение фильтров.

3. Хорошо, я предположил, что вы создавали динамический запрос.

4. А, ладно. Я уже исправил это, как только опубликовал свое сообщение. Я боялся, что забыл что-то еще. 🙂

5. @user396449: манджи сделал то же самое, но его решение использовать 0 вместо пустой строки более правильное. 🙂 Примените это к вашему окончательному запросу.