J'ai une table qui, en raison du système tiers que nous utilisons, a parfois des données en double. Comme le modèle utilise une méthode EAV, il n'y a aucun moyen de filtrer la "bonne" manière, donc j'agrège les données dans une vue - Je sais que c'est un problème de collecte de données mais il est plus facile pour moi de le réparer. passer par ce système et potentiellement casser les données et les formulaires existants. J'ai besoin de cocher l'un des deux champs pour voir si l'un ou les deux sont entrés, mais n'en choisir qu'un (sinon le nom s'affiche deux fois comme ceci: "John, John" au lieu de simplement "John"). Voici mon code pour la partie pertinente:MySQL CASE "Else Case When" est en cours d'exécution lorsque la condition est vraie - qu'est-ce qui me manque?
group_concat(
(
case when (`s`.`fieldid` = 2) then `s`.`data`
else
case when (`s`.`fieldid` = 35) then `s`.`data`
else NULL end
end
) separator ','),_utf8'') as first_name
Si les deux fieldid 2 et FieldID 35 sont entrés, j'attendre à ce que pour revenir seulement la valeur de fieldid = 2 et non la valeur de fieldid = 35, puisque Else La clause ne doit pas s'exécuter lorsque le cas d'origine est vrai. Cependant, il saisit cela, et puis encore en cours d'exécution à l'intérieur de la clause else?
Comment puis-je corriger ce code pour me donner fieldid = 2 OU fieldid = 35, mais éviter de les regrouper ensemble ce qui entraîne la duplication du nom?
EDIT
Voici la structure de la table:
table: subscribers_data
subscriberid (int) fieldid (int) data (text)
Il utilise une structure EAV donc un enregistrement de l'échantillon pourrait être:
subscriberid fieldid data
1 2 John
1 3 Smith
1 35 John
1 36 Smith
avec fieldid 2 et 35 étant champ personnalisé "Prénom" (défini dans une table distincte) et fieldid 3 et 36 étant "Nom".
Voici la vue complète que j'utilise:
select `ls`.`subscriberid` AS `id`,
left(`l`.`name`,(locate(_utf8'_',`l`.`name`) - 1)) AS `user_id`,
ifnull(group_concat((
case when (`s`.`fieldid` = 2) then `s`.`data`
when (`s`.`fieldid` = 35) then `s`.`data`
else NULL end) separator ','),_utf8'') AS `first_name`,
ifnull(group_concat((
case when (`s`.`fieldid` = 3) then `s`.`data`
when (`s`.`fieldid` = 36) then `s`.`data`
else NULL end) separator ','),_utf8'') AS `last_name`,
ifnull(`ls`.`emailaddress`,_utf8'') AS `email_address`,
ifnull(group_concat((
case when (`s`.`fieldid` = 81) then `s`.`data`
else NULL end) separator ','),_utf8'') AS `mobile_phone`,
ifnull(group_concat((
case when (`s`.`fieldid` = 100) then `s`.`data`
else NULL end) separator ','),_utf8'') AS `sms_only`
from ((`list_subscribers` `ls`
join `lists` `l` on((`ls`.`listid` = `l`.`listid`)))
left join `subscribers_data` `s` on((`ls`.`subscriberid` = `s`.`subscriberid`)))
where (left(`l`.`name`,(locate(_utf8'_',`l`.`name`) - 1)) regexp _utf8'[[:digit:]]+')
group by `ls`.`subscriberid`,`l`.`name`,`ls`.`emailaddress`
La vue est utilisée comme modèle pour une application Ruby on Rails, alors j'utilise quelques bidouillages créatif pour un faux " user_id "que Rails attend (nous nommons le champ list.name dans la table Lists en utilisant un identifiant numérique que notre application Rails frontaux génère lorsque nous ajoutons un nouvel utilisateur, donc j'extrais juste ce nombre pour que la vue ressemble à une table de base de données Rails-convention)
Une idée de comment le gérer? Je peux enlever group_concat de l'échantillon que j'ai montré ci-dessus et cela semble fonctionner, mais le faire à un autre (avec des ID différents) ne me donne aucun résultat même quand ils sont tous les deux là, mais en gardant group_concat me le donne deux fois. –
Publiez la requête actuelle que vous exécutez et la structure de la table. –
L'utiliser sans group_concat ne semble pas non plus me donner de données pour certains enregistrements où les données existent. C'est très bizarre et déroutant. –