J'essaie d'extraire les identifiants des utilisateurs appartenant à un groupe. Je dois ensuite prendre ces identifiants et obtenir les adresses électroniques de ces identifiants. Les résultats doivent être séparés par des virgules. Lors de ma première tentative, j’ai pensé que j’avais besoin de l’identifiant de l’utilisateur, j’ai donc écrit ce qui suit. Cela fonctionne très bien et me donne tous les identifiants dans une liste séparée par des virgules. Je ne comprends pas comment utiliser maintenant les résultats de la requête ci-dessous pour obtenir les adresses électroniques de la base de données lc_users WHERE 'id' = les résultats de la requête ci-dessous
$db = JFactory::getDbo();
$db->setQuery("SELECT `memberid` FROM `lc_community_groups_members` WHERE `groupid` = 1 AND `approved` = 1 ");
$column = $db->loadColumn();
return(implode(',',$column));
Toute aide serait très appréciée
Oui, JOIN devrait faire l'affaire. Voici ma requête:
$query->select($db->quoteName('b.email'))
->from($db->quoteName('#__community_groups_members', 'a'))
->leftJoin(
$db->quoteName('#__users', 'b')
. ' ON (' . $db->quoteName('b.id')
. ' = '
. $db->quoteName('a.memberid') . ')'
)
->where($db->quoteName('a.groupid') . ' = 1 ')
->where($db->quoteName('a.approved') . ' = 1');
Premièrement, je vous suggérerais d’utiliser les normes de codage les plus récentes pour votre requête de base de données, comme indiqué sur la page de documentation.
Vous pouvez réellement tout combiner en 1 requête en utilisant un join
et devrait également utiliser #__
comme préfixe de votre base de données qui sera automatiquement remplacé par lc_
.
Je ne l'admets pas, je ne suis pas extrêmement confiant en ce qui concerne les jointures, mais essayez ce qui suit:
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('a.*', 'b.memberid')))
->from($db->quoteName('#__community_groups_members', 'a'))
->where($db->quoteName('groupid') . ' = 1')
->where($db->quoteName('approved') . ' = 1')
->join('INNER', $db->quoteName('#__users', 'b') . ' ON (' . $db->quoteName('b.email') . ' = ' . $db->quoteName('b.id') . ')')
->where($db->quoteName('b.id') . ' = ' . $db->quote('b.memberid'));
$db->setQuery($query);
$column = $db->loadColumn();
Votre tâche souhaite une chaîne unique contenant des adresses électroniques séparées par des virgules - SQL peut faire tout cela à votre place et quelques astuces pratiques.
$db = JFactory::getDBO();
try {
$query = $db->getQuery(true)
->select("GROUP_CONCAT(DISTINCT B.email ORDER BY B.email)")
->from("lc_community_groups_members A")
->innerJoin("lc_users B ON A.memberid = B.id")
->where("A.groupid = 1 AND A.approved = 1");
//echo $query->dump();
$db->setQuery($query);
if (!$emails = $db->loadResult()) {
echo "No Qualifying Email Addresses";
} else {
echo $emails;
}
} catch (Exception $e) {
echo "Syntax Error"; // . $e->getMessage();
}
Avec des exemples de données comme ceci:
| lc_community_groups_members | JOIN ON memberid=id | lc_users |
|-------------------------------------| |-------------------------|
| memberid | groupid | approved | | id | email |
|------------|-----------|------------| |-------------------------|
| 1 | 2 | 1 | < | 1 | [email protected] |
| 2 | 1 | 1 | < | 2 | [email protected] |
| 3 | 1 | 0 | < | 3 | [email protected] |
| 4 | 1 | 1 | < | 4 | [email protected] |
| 5 | 1 | 1 | < | 5 | [email protected] |
| 6 | 2 | 0 | < | 6 | [email protected] |
| 7 | 1 | 0 | < | 7 | [email protected] |
| 8 | 1 | 1 | < | 8 | [email protected] |
| 9 | 1 | 1 | < | 9 | [email protected] |
--------------------------------------- ---------------------------
Vous vous attendriez à recevoir les emails de ids: 2,4,5,8,9
La sortie de mon bloc de code est:
[email protected],[email protected],[email protected],[email protected]