Используйте Select data во вложенном операторе Select в MySQL - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть запрос в MySQL.

Полный запрос

SELECT 
  tc.expense AS expense,
  tc.tour_sub_code,
  tc.login_id

FROM
  tc_wallet tc 
WHERE tc.login_id = 'vinod.kumbala' 
  AND tc.expense = 'Daily Allowance' 
  AND tc.delete_flag = 'F' 
  AND tc.status != 'reject' 

Результат

Expense              Tour_sub_code          login_id 

DAILY ALLOWANCE       MOS-EUROPE100119      vinod.kumbala
DAILY ALLOWANCE       Test                  vinod.kumbala

Изначально я получаю данные из таблицы tc_wallet.
Теперь мое требование заключается в том, что мне нужно найти общее количество посещений для конкретного tour_sub_code. Количество посещений можно найти из таблицы attendance_master для , что особенно tour_sub_code. Поэтому я включил вложенный запрос выбора, который равен

Вложенный выбор

(SELECT 
    COUNT(*) 
  FROM
    (SELECT 
      * 
    FROM
      `attendance_master` 
    WHERE `delete_flag` = 'F' 
      AND login_id = 'vinod.kumbala' 
      AND `tour_sub_code` = tc.`tour_sub_code` 
    GROUP BY `device_date`) t1) AS newNoOfdays 

Полный запрос

SELECT 
      tc.expense AS expense,
      tc.tour_sub_code,
      tc.login_id,
      (SELECT 
        COUNT(*) 
      FROM
        (SELECT 
          * 
        FROM
          `attendance_master` 
        WHERE `delete_flag` = 'F' 
          AND login_id = 'vinod.kumbala' 
          AND `tour_sub_code` = tc.`tour_sub_code` 
        GROUP BY `device_date`) t1) AS newNoOfdays 

    FROM
      tc_wallet tc 
    WHERE tc.login_id = 'vinod.kumbala' 
      AND tc.expense = 'Daily Allowance' 
      AND tc.delete_flag = 'F' 
      AND tc.status != 'reject' 

Теперь этот запрос выдает мне ошибку как

Неизвестный столбец «tc.tour_sub_code» в «где предложение»

Ожидаемый результат

Expense              Tour_sub_code          login_id            Count

    DAILY ALLOWANCE       MOS-EUROPE100119      vinod.kumbala     20
    DAILY ALLOWANCE       Test                  vinod.kumbala     44

Могу ли я знать, где я иду с этим не так?
Также есть ли другой способ получить результат, как с помощью JOINS?

Ответы [ 4 ]

1 голос
/ 03 апреля 2019

В самом внутреннем подзапросе вы ссылаетесь на столбец из самого внешнего запроса. Это недопустимо для подзапросов в предложении FROM (производные таблицы). Однако - Вам не нужен этот подзапрос. Что вам нужно, это COUNT(DISTINCT device_date)

Перепишите

(SELECT 
    COUNT(*) 
  FROM
    (SELECT 
      * 
    FROM
      `attendance_master` 
    WHERE `delete_flag` = 'F' 
      AND login_id = 'vinod.kumbala' 
      AND `tour_sub_code` = tc.`tour_sub_code` 
    GROUP BY `device_date`) t1) AS newNoOfdays 

до

(SELECT 
    COUNT(DISTINCT device_date)
  FROM `attendance_master` 
  WHERE `delete_flag` = 'F' 
    AND login_id = 'vinod.kumbala' 
    AND `tour_sub_code` = tc.`tour_sub_code` 
) AS newNoOfdays 

Вы также можете переписать полный запрос к запросу LEFT JOIN:

SELECT 
  tc.expense AS expense,
  tc.tour_sub_code,
  tc.login_id,
  COUNT(DISTINCT device_date) AS newNoOfdays 
FROM tc_wallet tc
LEFT JOIN attendance_master am
  ON  am.tour_sub_code = tc.tour_sub_code
  AND am.delete_flag = 'F' 
  AND am.login_id = 'vinod.kumbala' 
WHERE tc.login_id = 'vinod.kumbala' 
  AND tc.expense = 'Daily Allowance' 
  AND tc.delete_flag = 'F' 
  AND tc.status != 'reject' 
0 голосов
/ 03 апреля 2019

Попробуйте это ---

SELECT 
      tc.expense AS expense,
      tc.tour_sub_code,
      tc.login_id,
      (SELECT 
        COUNT(am.*) 
      FROM `attendance_master` as am
        WHERE am.delete_flag = 'F' 
          AND am.login_id = 'vinod.kumbala' 
          AND am.tour_sub_code = tc.tour_sub_code
        GROUP BY am.device_date) AS count 

    FROM
      tc_wallet tc 
    WHERE tc.login_id = 'vinod.kumbala' 
      AND tc.expense = 'Daily Allowance' 
      AND tc.delete_flag = 'F' 
      AND tc.status != 'reject' 
0 голосов
/ 03 апреля 2019

Можете ли вы попробовать это:

select  tc.expense AS expense,
        tc.tour_sub_code,
        tc.login_id,
        newNoOfdays.countVal
from    tc_wallet tc
inner join
        (   select  tour_sub_code, count('A') 'countval'
            from    attendance_master ascs (nolock)
            group by tour_sub_code) as newNoOfdays
on  newNoOfdays.tour_sub_code = tc.tour_sub_code
where   tc.login_id = 'vinod.kumbala' 
AND     tc.expense = 'Daily Allowance' 
AND     tc.delete_flag = 'F' 
AND     tc.status != 'reject' 
0 голосов
/ 03 апреля 2019

Попробуйте это:

SELECT 
      tc.expense AS expense,
      tc.tour_sub_code,
      tc.login_id,
      count(*) as count

    FROM
      tc_wallet tc
    INNER JOIN
      attendance_master am
    ON
      tc.tour_sub_code = am.tour_sub_code AND
      tc.login_id = am.login_id

    WHERE tc.login_id = 'vinod.kumbala' 
      AND tc.expense = 'Daily Allowance' 
      AND tc.delete_flag = 'F' 
      AND tc.status != 'reject'

    GROUP BY 
      tc.expense AS expense,
      tc.tour_sub_code,
      tc.login_id
...