J'ai une requête dans MySQL.
Requête complète
Expense Tour_sub_code login_id Count
DAILY ALLOWANCE MOS-EUROPE100119 vinod.kumbala 20
DAILY ALLOWANCE Test vinod.kumbala 44
Résultat
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'
Au départ, je récupère les données de la table tc_wallet .
Maintenant, mon exigence est que je dois trouver le nombre total de participants pour un tour_sub_code particulier. Le nombre de participants peut être trouvé dans le tableau participation_master pour ce tour_sub_code particulier.
J'ai donc inclus une requête Select imbriquée qui est
Sélection imbriquée
(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
Requête complète
Expense Tour_sub_code login_id DAILY ALLOWANCE MOS-EUROPE100119 vinod.kumbala DAILY ALLOWANCE Test vinod.kumbala
Maintenant, cette requête me donne une erreur en tant que
Colonne inconnue 'tc.tour_sub_code' dans 'clause where'
Résultat attendu
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'
Puis-je savoir où je me trompe?
Y a-t-il également une autre façon d'obtenir des résultats comme en utilisant JOINS?
4 Réponses :
Essayez ceci:
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
Essayez ceci ---
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'
Pouvez-vous essayer ceci:
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'
Dans la sous-requête la plus interne, vous faites référence à une colonne de la requête la plus externe. Cela n'est pas autorisé pour les sous-requêtes dans la clause FROM (tables dérivées). Cependant, vous n'avez pas besoin de cette sous-requête. Ce dont vous avez besoin, c'est de COUNT (DISTINCT device_date)
Réécrire
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'
en
(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
Vous pouvez également réécrire la requête complète en une requête LEFT JOIN:
(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